Zed Shaw のLearn Ruby The Hard Wayに取り組んでいますが、IRB にモジュールを含む問題が発生しています。演習 25では、新しいモジュール Ex25 を定義し、IRB でそれを必要とし、そのモジュールの名前空間を通じてさまざまなメソッドを使用できますEx25.break_words(sentence)
。エクストラクレジットでは、入力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 に答える