我在学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
的实例上可用,但不会在类本身上可用。