使用什么机制来允许从该范围调用ruby根范围中定义的方法?

时间:2011-05-06 22:58:51

标签: ruby metaprogramming class-design language-design

在ruby中,当在根范围中定义方法时,可以从该范围调用它:

def foo
  "foo"
end
foo #=> "foo"

在任何其他情况下,情况并非如此:

class Bar
  def foo
    "foo"
  end
  foo #=> Error: No Method `foo` for class Bar
end

在设置允许这种情况发生的main对象(Object的实例)时使用了什么机制?

3 个答案:

答案 0 :(得分:5)

这在Ruby中非常特别。如果在全局范围内定义方法,则它们实际上在Kernel上实际定义,默认情况下包含在每个对象中。

当没有定义其他上下文时,内核也存在。由于Class继承自其上定义的内核方法,因此也在类范围的范围内。

答案 1 :(得分:1)

只是为了确认Jakub Hampl说的话:

def foo
  "Debugging: self is #{self.inspect}"
end
foo # => "Debugging: self is main"

class Bar
  def goo
    foo
  end
end

Bar.new.goo # => "Debugging: self is #<Bar:0x1513cc0>"

答案 2 :(得分:0)

您应该将其定义为类方法(self)而不是实例方法

class Bar
  def self.foo
    "foo"
  end
  foo 
  #=> "foo"
end