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 では使えなくなるかも、とのことです。ささださんありがとうございました。