在模块上定义的实例方法:
module A
def foo; :bar end
end
当包含该模块时,似乎可以作为该模块的模块方法调用:
include A
A.foo # => :bar
为什么?
答案 0 :(得分:7)
你将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/
答案 1 :(得分:0)
在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