Ruby 顶级方法中“self”的规则是什么?
如果我在Ruby文件中定义一个顶级方法,Ruby 顶级方法中“self”的规则是什么?,ruby,self,Ruby,Self,如果我在Ruby文件中定义一个顶级方法,self的值似乎很大程度上取决于调用它的人 def who_am_i puts self.inspect end class A def self.foo who_am_i end def foo who_am_i end end def foo who_am_i end foo # >> main A.foo # >> A A.new.foo # >>
self
的值似乎很大程度上取决于调用它的人
def who_am_i
puts self.inspect
end
class A
def self.foo
who_am_i
end
def foo
who_am_i
end
end
def foo
who_am_i
end
foo # >> main
A.foo # >> A
A.new.foo # >> #<A:...>
def我是谁
自我检查
结束
甲级
def self.foo
我是谁
结束
德福
我是谁
结束
结束
德福
我是谁
结束
foo#>>main
A.foo#>>A
A.new.foo>#
显然,如果在类中定义了方法,
self
将是类本身(对于类方法)或类的相关实例(例如实例方法)。根据上面显示的试验,似乎类中未定义的方法从其调用方继承了self
,但我找不到任何官方引用或任何东西来支持它。是否有人能提供一个官方的源代码来描述这种行为,以及理想情况下为什么它会以这种方式工作?Ruby会在Ruby启动时创建一个名为main的对象,main是Ruby程序的顶级上下文(也称为顶级范围)。顶级范围中定义的方法(即未包装在类或模块中的方法)将绑定到主对象
更多参考和是的,正如绝地所提到的,在ruby中,你总是处于某个对象的上下文中。ruby中没有函数,只有方法。 方法是在某个对象上定义的(确切地说是在其类或单例类上) 您可以将
main
想象成这样运行程序:
main_obj = Object.new
main_obj.instance_eval do
# your program goes here
# this defines method on `main_obj` singleton class
def f
puts 123
end
f
end
我想您可以阅读在
main
对象上下文中定义的所有方法,它们将成为对象上的[private]方法。由于一切都是一个对象,这种方法在任何地方都是可用的。这也是为什么self
会根据调用它的位置而变化的原因:它们都是不同的对象,但它们也都继承了这个方法
private_methods.include?(:who_am_i) # => true
foo # => "main"
A.private_methods.include?(:who_am_i) # => true
A.foo # => "A"
A.new.private_methods.include?(:who_am_i) # => true
A.new.foo # => "#<A:0x00007feaad034e00>"
private_方法。包括?(:who_am_i)#=>true
foo#=>“main”
私人方法。包括:(我是谁?=>正确
A.foo=>“A”
新的私人方法。包括:(:我是谁?=>真的
A.new.foo#=>“#”
Yes,@CarySwoveland在Ruby中,一切都是对象,甚至main
。简单检查:打开irb
并键入self
#=>main
,然后键入self.class
#=>对象
对不起,main
显然是一个对象,是对象
的实例。(WWIT?@jedi:“一切都是一个物体”-积木不是物体(可能还有一两个其他物体)。更好的断言是“大多数事物都是对象”: