我正在研究 Zed Shaw 的Learn Ruby The Hard Way,我遇到了一个问题,包括 IRB 中的一个模块。在练习 25中,我们定义了一个新模块 Ex25,在 IRB 中 require 它,然后可以通过该模块的命名空间使用它的各种方法,例如Ex25.break_words(sentence)
. 在 Extra Credit 中,它指出键入include Ex25
基本上会将模块中的方法添加到当前的“空间”中(不确定如何调用它),然后您可以在不显式引用模块的情况下调用它们,例如break_words(sentence)
. 但是,当我这样做时,我收到“未定义的方法”错误。任何帮助/解释将不胜感激,谢谢!
问问题
2840 次
1 回答
7
这是书中的错误。中的方法Ex25
是类方法。include
将实例方法添加到“当前空间”。从方法定义中删除self
,它将起作用:
module Ex25
def break_words(stuff)
stuff.split(' ')
end
end
include Ex25
break_words 'hi there' # => ["hi", "there"]
如果你好奇,这里有一些关于发生了什么的更多细节: 包含方法的地方——“当前空间”——是 Object 类:
Object.included_modules # => [Ex25, Kernel]
所有 Object 实例都获得包含的方法...
Object.new.break_words 'how are you?' # => ["how", "are", "you?"]
...而顶层只是一个 Object 实例:
self.class # => Object
可是等等。如果顶层是一个 Object 实例,为什么它会响应include
?不是(及其子类)include
的实例方法吗?答案是顶层有一个单例方法......Module
Class
singleton_methods.include? "include" # => true
...我们可以假设转发给 Object 类。
于 2014-01-16T23:49:07.257 回答