2

我完全迷失了self关键字。当我们进入模块、类、方法、块或其他所有内容时,它会如何变化?谁能给我一个总结?

在这里,我要问 self 是如何随着执行而改变的,而不是 self 的含义。

4

2 回答 2

3

与 JavaScriptthis可能引用任意数量的事物不同,在 Ruby 中self总是引​​用当前方法的执行上下文

class方法中,self将引用类本身:

class FooClass
  def self.bar
    self # => FooClass
  end
end

class实例方法中,self将引用实例:

class FooClass
  def bar
    self # => This instance (FooClass#nnnn)
  end
end

在一个module方法内,self可以指模块:

module FooModule
  def self.bar
    self # => FooModule
  end
end

当一个模块方法被混入 viainclude时,它将引用一个实例:

module FooModule
  def bar
    self # => (Depends on included context)
  end
end

class BarClass
  include FooModule

  def foo
    bar # => This instance (BarClass#nnnn)
  end
end

唯一棘手的部分是模块,它们之所以棘手,是因为其他东西可以包含它们。最好记住它的方法self通常是指点左侧的东西。也就是说,my_object.foo手段selfmy_object在该方法的直接上下文中。

有一些方法可以通过使用和类型操作或声明来操作eigenclassself在块的上下文中重新定义。instance_evalclass_evalclass << self

于 2013-03-25T22:47:14.070 回答
3

self总是指当前对象。

class A
  p self # => A

  def foo
    p self # => instance of A
  end
end

module M
  p self # => M
end

A.new.foo
于 2013-03-25T21:18:08.620 回答