在模块上定义的实例方法:
module A
def foo; :bar end
end
当包含该模块时,似乎可以作为该模块的模块方法调用:
include A
A.foo # => :bar
这是为什么?
在模块上定义的实例方法:
module A
def foo; :bar end
end
当包含该模块时,似乎可以作为该模块的模块方法调用:
include A
A.foo # => :bar
这是为什么?
您将 A 包含在对象中。
module A
def self.included(base)
puts base.inspect #Object
end
def foo
:bar
end
end
include A
puts A.foo # :bar
puts 2.foo # :bar
#puts BasicObject.new.foo #this will fail
另请注意,顶级对象main
是特殊的;它既是 Object 的实例,又是 Object 的一种委托者。
见http://banisterfiend.wordpress.com/2010/11/23/what-is-the-ruby-top-level/
在 irb 中尝试过,它包含在Object
. include A
也返回Object
irb > module A
irb > def foo; :bar end
irb > end
=> nil
irb > Object.methods.include? :foo
=> false
irb > include A
=> Object
irb > Object.methods.include? :foo
=> true