instance_eval
関連するブロックへの引数としてyieldがあることに気付きself
ました (1.9.2 バージョンのバグを除く: http://www.ruby-forum.com/topic/189422 )
1.9.3p194 :003 > class C;end
1.9.3p194 :004 > C.new.instance_eval {|*a| a}
=> [#<C:0x00000001f99dd0>]
1.9.3p194 :005 >
これはどこかに文書化/仕様化されていますか? ruby-doc:BasicObjectを見ると、言及されているブロック パラメータが見当たりません。
とにかくそれ自身が常に定義されているときに明示的に渡す理由はありますか?
私がこれに打たれた方法は次のとおりです。
l = lambda { }
myobj.instance_eval(&l) # barks
これは 1.8.x では問題なく機能しました (ブロックのアリティが強制されていなかったためだと思います)。
その後、1.9.2 にアップグレードしましたが、それでも機能しました。これは、ラムダ ブロックの引数が厳密に適用されているにもかかわらず (そのため、self の引数を宣言しないと不平を言うことになります)、奇妙な偶然の一致ですが、上記のリンクにあるバグにより、self は実際にはこのバージョンでは渡されませんでした..
次に、そのバグが修正された1.9.3にアップグレードしたため、引数エラーがスローされ始めました-マイナーバージョン変更のIMHOにはかなり驚くべきことです。
したがって、1 つの回避策は、パラメーターを宣言するか、代わりにラムダをブロックにすることです。
l = proc { }
myobj.instance_eval(&l) # fine
これが適切に文書化されるまで、他の人が私のように時間を無駄にするのを避けるために、完全なストーリーを説明することを考えただけです.