为什么在包含后可以将实例方法作为模块方法调用?

时间:2013-08-02 04:51:13

标签: ruby

在模块上定义的实例方法:

module A
  def foo; :bar end
end
当包含该模块时,

似乎可以作为该模块的模块方法调用:

include A
A.foo # => :bar

为什么?

2 个答案:

答案 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