Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 顶级方法中“self”的规则是什么?_Ruby_Self - Fatal编程技术网

Ruby 顶级方法中“self”的规则是什么?

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 # >>

如果我在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 # >> #<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:“一切都是一个物体”-积木不是物体(可能还有一两个其他物体)。更好的断言是“大多数事物都是对象”: