我在学ruby,最近发现了一些我不太懂的东西。当将模块混合到类中时,类对象无法访问模块实例方法。

module Swimmable
  def swim
    puts 'can swim'
  end
end

class Fish
  include Swimmable
end

Fish.swim

结果undefined method 'swim' for Fish:Class (NoMethodError)这是预期的
但是,如果实例方法是在内核模块中定义的,我可以使用类对象和实例对象来访问它。
module Kernel
  def swim
    puts 'can swim'
  end
end

class Fish; end

Fish.swim # => can swim
Fish.new.swim # => can swim

是什么使类对象能够访问内核模块中的实例方法?

最佳答案

从AA>
内核模块包含在类对象中,因此它的方法在每个ruby对象中都是可用的。
Fish实例和Fish类本身都是对象,因此它们具有Kernel中定义的所有方法。
在第一种情况下,您会得到错误,因为在Swimmable中包含Fish将使Swimmable成员在Fish的实例上可用,但不会在类本身上可用。

10-06 08:42