self总是引用实例方法定义中的当前实例吗?

mrw*_*t10 1 ruby oop

我从这个问题中理解,在实例方法中,self引用了类的当前实例.无论您在实例方法定义中有多少层方法或循环,这都是真的吗?

Mat*_*att 5

通常,是的,虽然有一些元编程方法可以用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
Run Code Online (Sandbox Code Playgroud)

如果没有仔细阅读,您可能会认为self块内的内容是指Bar实例,但事实并非如此.

所以你看,在大多数情况下,你可以假设自我是进入方法时受约束的自我.虽然你有能力传递块来获得不同的绑定,self但不会在Ruby中"偶然"重新绑定.有关更有趣的阅读,您可以查看ruby Binding类的文档.