【发布时间】:2017-02-04 19:38:01
【问题描述】:
我正在学习 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
是什么让类对象Fish 能够访问内核模块中的实例方法?
【问题讨论】:
-
如果您希望
Swimmable可用于您的类对象,请在Fish中写入extend Swimmable。这样就不需要在Kernel中定义模块了。延伸阅读搜索词:单例类