読者です 読者をやめる 読者になる 読者になる

初めてのRuby − 9.6.2 method_missing

Ruby 初めてのRuby

わんくまの掲示板で、定義済みのクラスのメンバ関数を、より短い名前で呼ぶようにしたいという質問あり。

class Graphics g {
  void Image_Load() { }
  void Image_Draw() { }
};

とあってGraphicsクラス内部にクラスor構造体 aImage を設けて

aG.aImage.Draw()

などと呼びたいとのこと。
一つ一つ置き換えるのは手間がかかるなと思ってて、初めてのRubyの9.6.2に出会う。

class MyClass # 元のクラスのイメージ
  def Image_Draw(*arg)
    puts "Image_Draw called with (#{arg})"
  end
  def Image_Load(*arg)
    puts "Image_Load called with (#{arg})"
  end
end

class MyClass # 再度クラスを開いてメソッド定義
  def method_missing(name, *arg)
    eval("Image_#{name}(#{arg})") # eval何ぞを使ってみる
  end
end

a = MyClass.new
a.Image_Draw
a.Image_Draw(1)
a.Image_Load
a.Image_Load(2)
a.Draw
a.Draw(3)

evalなんぞを使って引数ごと元のメソッドを呼び出してみた。