IRB中的Ruby Include模块

时间:2014-01-16 23:21:55

标签: ruby irb learn-ruby-the-hard-way

我正在通过Zed Shaw的Learn Ruby The Hard Way工作,我遇到了一个问题,包括IRB中的一个模块。在exercise 25中,我们定义了一个新模块Ex25,在IRB中需要它,然后可以通过该模块的命名空间使用其各种方法,例如: Ex25.break_words(sentence)。在Extra Credit中,声明键入include Ex25基本上会将模块中的方法添加到当前“空间”(不知道该怎么称呼它),然后您可以在不明确引用模块的情况下调用它们,例如: break_words(sentence)。但是,当我这样做时,我得到一个“未定义的方法”错误。任何帮助/解释将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:6)

这是书中的错误。 Ex25中的方法是 class 方法。 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.new.break_words 'how are you?'  # => ["how", "are", "you?"]

...而顶层只是一个Object实例:

self.class  # => Object

但是等等。如果顶级是Object实例,为什么它会响应includeinclude的实例方法Module(及其子类Class)不是singleton_methods.include? "include" # => true 吗?答案是顶层有一个单例方法......

{{1}}

...我们可以假设转发给Object类。