我完全迷失了self
关键字。当我们进入模块、类、方法、块或其他所有内容时,它会如何变化?谁能给我一个总结?
在这里,我要问 self 是如何随着执行而改变的,而不是 self 的含义。
与 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
手段self
是my_object
在该方法的直接上下文中。
有一些方法可以通过使用和类型操作或声明来操作eigenclassself
在块的上下文中重新定义。instance_eval
class_eval
class << self
self
总是指当前对象。
class A
p self # => A
def foo
p self # => instance of A
end
end
module M
p self # => M
end
A.new.foo