【问题标题】:Ruby Include Module in IRBIRB 中的 Ruby 包含模块
【发布时间】:2014-01-16 23:21:54
【问题描述】:

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

【问题讨论】:

  • ... 包括调用 include 返回的内容,如果有的话。

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


【解决方案1】:

这是书中的一个错误。 Ex25 中的方法是 class 方法。 includeinstance 方法添加到“当前空间”。从方法定义中删除 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实例,为什么它会响应includeinclude 不是Module(及其子类Class)的实例方法吗?答案是顶层有一个单例方法...

singleton_methods.include? "include"  # => true

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

【讨论】:

  • 效果很好,很有启发性。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2011-03-30
  • 2011-09-24
相关资源
最近更新 更多