我知道我可以使用define_method
在类上动态定义方法,并且我可以使用块的arity来指定该方法接受的参数。
我想动态定义一个既接受可选参数又接受块的方法。在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 对我来说不是一个选择。这是一个无法解决的问题吗,还是有办法解决?