3

Zed Shaw のLearn Ruby The Hard Wayに取り組んでいますが、IRB にモジュールを含む問題が発生しています。演習 25では、新しいモジュール Ex25 を定義し、IRB でそれを必要とし、そのモジュールの名前空間を通じてさまざまなメソッドを使用できますEx25.break_words(sentence)。エクストラクレジットでは、入力include Ex25すると基本的にモジュールから現在の「スペース」にメソッドが追加され(何と呼ぶか​​わかりません)、モジュールを明示的に参照せずに呼び出すことができると述べられていますbreak_words(sentence)。ただし、これを行うと、「未定義のメソッド」エラーが発生します。どんな助け/説明も大歓迎です、ありがとう!

4

1 に答える 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のインスタンス メソッドではありませんか? 答えは、最上位にシングルトン メソッドがあるということです...ModuleClass

singleton_methods.include? "include"  # => true

... Object クラスに転送すると仮定できます。

于 2014-01-16T23:49:07.257 に答える