在IRB中如何包含Ruby模块

3
我正在学习Zed Shaw的《笨办法学 Ruby》,在练习25中,我们定义了一个新模块Ex25,在IRB中调用它,并且可以通过该模块的命名空间使用其各种方法,例如Ex25.break_words(sentence)。在额外的练习中,它说明键入include Ex25将基本上把模块中的方法添加到当前“空间”(不确定如何称呼),然后您可以调用它们而无需显式地引用该模块,例如break_words(sentence)。但是,当我这样做时,却出现了“未定义的方法”错误。任何帮助/解释都将不胜感激,谢谢!

包括调用 include 返回的任何内容。 - Bob Gilmore
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.new.break_words 'how are you?'  # => ["how", "are", "you?"]

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

self.class  # => Object

但是请稍等。如果顶层是一个对象实例,为什么它会响应include呢?include不是Module(以及其子类Class)的实例方法吗?答案是顶层有一个单例方法...

singleton_methods.include? "include"  # => true

我们可以假设它向Object类转发。

那个完美地运行了,而且真的很有教育意义。非常感谢! - orenyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接