モジュールのメソッド名にモジュール名をつけるかつけないかで挙動が変わって、とても困ってた。
以下のコードを実行すると、
module A def A.a 'A.a' end def a 'a' end end class ClassA include A def print_a puts a end def print_A_a puts A.a end end ClassA.new.print_A_a puts A.a ClassA.new.print_a puts a
以下のようになる。
A.a A.a a a.rb:29: undefined local variable or method `a' for main:Object (NameError)
実行結果から推測すると、
- def A.aのとき
- includeした時、クラス内からA.aで呼べる
- includeせずに、トップレベルからA.aで呼べる
- def aのとき
- includeした時、クラス内からaで呼べる
- includeせずに、トップレベルからは呼べない
- 必ず、宣言と同じ名前を呼ぶ
- モジュール名とちがう名前はつけられない(例えば、module Aでdef B.bとか)
らしい。
これを知らずにモジュールを作ろうとして、とても苦労した。
これどっかに書いてあるんかなー。