私はdefine_method
を使ってクラスのメソッドを動的に定義することができ、このメソッドはブロックのアリティを使用してパラメータを指定することを知っています。ブロックを取るRubyメソッドを動的に定義できますか?
オプションのパラメータとブロックの両方を受け入れるメソッドを動的に定義する必要があります。 Ruby 1.9では、ブロックをブロックに渡すことができるため、これは簡単です。
残念ながら、Rubyの1.8はこれを許可していませんので、以下では動作しません。
#Ruby 1.8
class X
define_method :foo do |bar, &baz|
puts bar
baz.call if block_given?
end
end
x = X.new
x.foo("foo") { puts "called!"} #=> LocalJumpError: no block given
をいずれかの問題が解決しないyield
で明示的block.call
を交換します。
Ruby 1.9へのアップグレードは残念ながら私の選択肢ではありません。これは難しい問題なのでしょうか、それともその周りに道がありますか?
は、私は、文字列を渡す必要がありますかto class_eval?ブロックを渡すことはできませんが、スコープは維持されますか? – andrewdotnich
@andrewdotnichさて、メソッドを動的に定義する方法の問題に戻ります。 –
https://github.com/agrimm/zombie-chaser/blob/master/lib/zombie-chaser/chaser.rbには、ファイルの途中にあるブログ投稿へのリンクと例があります。 –