我知道我可以使用define_method
动态地定义一个类的方法,并且我使用块的arity指定了这个方法所需的参数。我可以动态地定义一个带块的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并不适合我。这是一个难以解决的问题,还是存在解决方法?
我需要传递一个字符串到class_eval?我不能通过一个块,这将保持范围界定? – andrewdotnich
@andrewdotnich好吧,那么你又回到了如何动态定义方法的问题。 –
https://github.com/agrimm/zombie-chaser/blob/master/lib/zombie-chaser/chaser.rb有一个例子和一个链接到文件中间的博客文章。 –