Skip to content

Instantly share code, notes, and snippets.

@kenjikaneko
Created October 25, 2012 04:51
Show Gist options
  • Save kenjikaneko/3950468 to your computer and use it in GitHub Desktop.
Save kenjikaneko/3950468 to your computer and use it in GitHub Desktop.
プログラミング言語Ruby, p285

#動的なメソッド定義

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 }
@ToQoz
Copy link

ToQoz commented Oct 25, 2012

String.class_eval {
  define_method(:greet)  do
    "Hello, " + self
  end
}

こっちのが普通にわかり易かったのではw

@ToQoz
Copy link

ToQoz commented Oct 25, 2012

説明には

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment