我学习Ruby并且最近发现了一些我不太了解的东西。将模块混合到Classes中时,类Object无法访问模块实例方法。
module Swimmable
def swim
puts 'can swim'
end
end
class Fish
include Swimmable
end
Fish.swim
结果是预期的undefined method 'swim' for Fish:Class (NoMethodError)
但是,如果在Kernel模块中定义了实例方法,我可以使用类对象和实例对象来访问它。
module Kernel
def swim
puts 'can swim'
end
end
class Fish; end
Fish.swim # => can swim
Fish.new.swim # => can swim
是什么让类对象Fish
能够访问内核模块中的实例方法?
答案 0 :(得分:1)
内核模块包含在Object类中,因此它的方法在每个Ruby对象中都可用。
Fish
个实例和Fish
类本身都是对象,因此它们具有Kernel
中定义的所有方法。
在第一种情况下,您会收到错误,因为在Swimmable
中加入Fish
会使Swimmable
成员在Fish
的实例上可用,但不会在类本身上。< / p>