#動的なメソッド定義
def add_method(c, m, &b)
c.class_eval {
define_method(m, &b)
}
end
add_method(String, :greet) { "Hello, " + self }
"world".greet
- クラスc に名前がm,本体のコードがbのメソッドを定義する。
##class_eval
- ブロックをクラス定義やモジュール定義の中のコードであるように実行。
##define_method
- 第一引数は新メソッドの名前、第二引数はメソッドの本体。
- private メソッドなので、クラスかモジュールの中のコードでなければ使えない。
クラスc に名前がm,本体のコードがbのメソッドを定義する。
def add_class_method(d, me ,&a)
eigenclass = class << d; self; end
eigenclass.class_eval {
define_method(me, &a)
}
end
add_class_method(String, :greet) {|name| "Arrow, " + self }
String.greet("japan")
String.define_singleton_method(:greet) {|name| "Pellow, " + name }
こっちのが普通にわかり易かったのではw