モジュールの練習
モジュールのインスタンス変数名がぶつかったときどっちが勝つのか?
module Mod1 def initialize @modval = 123 end def print_mval1 puts @modval end end module Mod2 def initialize @modval = 456 end def print_mval2 puts @modval end end class Cls include Mod2 include Mod1 end c = Cls.new c.print_mval1 c.print_mval2
結果:直近でincludeされたモジュール
mitsu@garlic$ ruby mod.rb 123 123
モジュールとクラスのinitializeはどっちが勝つか?
mitsu@garlic$ cat mod2.rb module Mod1 def initialize @modval = 123 end def print_mval1 puts @modval end end class Cls def initialize @clsval = 789 end def print_cval puts @clsval end include Mod1 end c = Cls.new c.print_cval c.print_mval1 mitsu@garlic$ ruby mod2.rb 789 nil
結果:クラスの勝ち。
当然、インスタンスにextendしたモジュールのinitializeは呼び出されない
mitsu@garlic$ cat mod3.rb module Mod1 def initialize @modval = 123 end def print_mval1 puts @modval end end class Cls end c = Cls.new c.extend Mod1 c.print_mval1 mitsu@garlic$ ruby mod3.rb nil