鉴于以下情况:
module Extension
def self.included(recipient)
recipient.extend(ModelClassMethods)
end
module ModelClassMethods
def self.msg
puts 'Hi from module'
end
end
end
class B
include Extension
end
为什么B.msg不可用?
>> B.msg
NoMethodError: undefined method `msg' for B:Class
from (irb):16
我是否以错误的方式思考这个问题?看起来这应该不是那么难以完成。
答案 0 :(得分:4)
msg
模块中的ModelClassMethods
方法应该声明为实例方法而不是类方法,因为扩展收件人类的行为已经使它成为类方法。所以:
module Extension
def self.included(recipient)
recipient.extend(ModelClassMethods)
end
module ModelClassMethods
def msg # Note lack of 'self.'
puts 'Hi from module'
end
end
end