【问题标题】:Does self ALWAYS refer to the current instance in an instance method definition?self 是否总是在实例方法定义中引用当前实例?
【发布时间】:2013-08-09 19:03:11
【问题描述】:

我从这个question 了解到,在实例方法中,self 指的是类的当前实例。无论实例方法定义中有多少层方法或循环,这都是真的吗?

【问题讨论】:

    标签: ruby oop


    【解决方案1】:

    一般来说,是的,尽管有一些元编程方法可以用 self 做一些奇怪的事情 - 例如,Object#instance_eval 允许您传递一个块以在另一个实例的上下文中进行评估。在这种情况下,块中的 self 就是另一个实例的 self,如下所示:

    class Foo
    end
    
    class Bar
      def wacky
        puts self.class #"Bar"
        Foo.new.instance_eval do
          puts self.class #"Foo"
        end
      end
    end
    

    如果不仔细阅读,您可能会认为块中的 self 指的是 Bar 实例,但事实并非如此。

    所以你看,在大多数情况下,你可以假设 self 是输入方法时绑定的 self。尽管您可以传递获得不同绑定的块,但 self 在 Ruby 中不会“意外”重新绑定。如需更有趣的阅读,您可以查看 ruby​​ Binding 类的文档。

    【讨论】:

    • self 在解释时不引用任何东西,并且在运行时总是引用当前实例。将块传递给 instance_eval 将对象设置为当前实例(即在您的示例中 foo 设置为当前实例)。所以不仅一般,而且总是
    • 是的,没错——我试图想出一个例子,在这个例子中,阅读代码会泄露给 self 的不同分配,而不是容易检测到的。不经意的读者可能会认为 def wacky 语句下的所有内容都将引用 Bar 实例,但并非总是如此 - 有一些方法可以在方法“内”重新分配 self。解释器很清楚 instance_eval 块内发生了上下文转换,但对于后来偶然发现此代码的程序员来说,则不太清楚。
    • 我喜欢这个答案(除了暗示 self 所指的内容不一致),我喜欢的是试图帮助阅读代码
    【解决方案2】:

    是的 self 总是引用 self ,即调用方法/块的实例

    【讨论】:

    • @chris 你为什么不认为 self 仍然是指调用方法/块的对象。任何方法调用集的 self 到实例并将块传递给 instance_eval 都会在调用实例上调用该方法。所以是的 self 总是指调用方法/块的对象。在给定对象的上下文中调用的方法有很多种
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2017-10-28
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2017-09-01
    • 2012-08-18
    相关资源
    最近更新 更多