【发布时间】:2013-08-09 19:03:11
【问题描述】:
我从这个question 了解到,在实例方法中,self 指的是类的当前实例。无论实例方法定义中有多少层方法或循环,这都是真的吗?
【问题讨论】:
我从这个question 了解到,在实例方法中,self 指的是类的当前实例。无论实例方法定义中有多少层方法或循环,这都是真的吗?
【问题讨论】:
一般来说,是的,尽管有一些元编程方法可以用 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 类的文档。
【讨论】:
def wacky 语句下的所有内容都将引用 Bar 实例,但并非总是如此 - 有一些方法可以在方法“内”重新分配 self。解释器很清楚 instance_eval 块内发生了上下文转换,但对于后来偶然发现此代码的程序员来说,则不太清楚。
是的 self 总是引用 self ,即调用方法/块的实例
【讨论】: