在全局上下文(main)中,当您包含模块时,可以直接从全局上下文中使用其方法。在一个类中,包括模块定义的实例方法无法从包含的相同上下文中调用。这是为什么?
示例:
module Foo
def hello
puts "Hello, world!"
end
end
# In a class:
class Bar
include Foo
hello # Hello is an instance method so it won't work here.
end
# In main
include Foo
hello # Works fine. Why?
答案 0 :(得分:1)
主要
包括Foo
你好#工作正常。为什么呢?
What is the Ruby Top-Level?一个关于这个概念的好博客,你必须先行。
因为在顶级,你在顶级对象#hello
上调用实例方法main
,这是Object
类的一个实例。在顶级你正在做{{1表示您将模块包含在include Foo
类中。这就是模块Object
的实例方法#hello
成为类Foo
的实例方法的原因。
object
如果您将方法调用为module Foo
def hello
puts "Hello, world!"
end
end
Object.include?(Foo) # => false
include Foo
Object.include?(Foo) # => true
self # => main
self.class # => Object
self.instance_of? Object # => true
hello # => Hello, world!
,则在顶层,但ruby正在内部执行hello
。 self.hello
是self
,我之前已解释过。