initialize に渡ってきたパラメタをインスタンス変数に丸投げする
の続きです。ささださんに教えてもらいました。有名な奥の手、だそうです。
#!/usr/local/bin/ruby class Player attr :name, :age define_method(:initialize) { |@name, @age| } end player = Player.new('Rubyo', 19) player.name.display
たしかにこれで "Rubyo" と表示されました。define_method は Kernel モジュールに実装されているプライベートメソッドでしょうか。Kenerl.define_method
としたところ
class.rb:5: private method `define_method' called for Kernel:Module (NoMethodError)
と出ました。ri define_method では
Defines an instance method in the receiver. The _method_ parameter can be a +Proc+ or +Method+ object. If a block is specified, it is used as the method body. This block is evaluated using +instance_eval+, a point that is tricky to demonstrate because +define_method+ is private. (This is why we resort to the +send+ hack in this example.)
とありました。"ブロックが指定されるとそれはメソッド本体として扱われる。このブロックは instance_eval
によって eval される" のあたりがこのトリックの種明かしのようです。
ささださんによると 2.0 では使えなくなるかも、とのことです。ささださんありがとうございました。