ruby で module を override したくて探したメモ

そもそも、使おうとした gem が module になってて、その中のクラスメソッドを override したくてぐぐったメモ。

やりたいことは簡単。

module Hoge のクラスメソッド (method1) を override し、クラスメソッドmethod2 を呼び出した時に override 後の内容が表示されればOK.

module Hoge
  def self.method1
    puts 'Hoge.method1'
  end

  def self.method2
    self.method1
  end
end

Hoge.method2 #=> Hoge.method1

以下2つ、どちらも再定義する形だけどこれでいいのかなー?

def Hoge.method1
  puts 'Override! Hoge.method1'
end

Hoge.method2 #=> Override! Hoge.method1
module Hoge
  def self.method1
    puts 'Override! Hoge.method1'
  end
end

Hoge.method2 #=> Override! Hoge.method1

でもこれだと当ファイルを読み込んだら、どこで Hoge.method1 を呼び出しても override したクラスメソッドが実行されるようだから あとあと地雷にならないか心配だ。もっとスマートに書けないのか。

railsやったりobjective-cやったりちょっとよくわかんない今日この頃。


あんまり関係ないけど以下の mix-in の説明すごく分かりやすい。

Rubyのmoduleをmix-inする際のincludeとextendの違いをシンプルな例で理解する - memo.yomukaku.net