hitode909の日記

趣味はマリンスポーツですの日記です

RubyでModuleを使ってみてすごくはまった

モジュールのメソッド名にモジュール名をつけるかつけないかで挙動が変わって、とても困ってた。
以下のコードを実行すると、

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とか)

らしい。


これを知らずにモジュールを作ろうとして、とても苦労した。
これどっかに書いてあるんかなー。