我想在C类中添加一个方法
class C
end
我定义了一个proc:
impl = proc{|x,y| puts "x=#{x} - y=#{y}"}
我将proc作为方法foo
添加到了类中:
C.send(:define_method, :foo, lambda do |args = impl.parameters.map { |arg| arg[1] }|
puts "foo is called"
impl.call(args)
end
)
当我将foo
称为C.new.foo(1,2)
时,我收到错误消息:
ArgumentError: wrong number of arguments (2 for 0..1)
为避免这种情况,我需要像foo
一样致电C.new.foo([1,2])
。有人可以告诉我如何避免这个问题吗?
答案 0 :(得分:0)
回答所述问题:
C.send(:define_method, :foo, lambda do |*args|
args = impl.parameters.map(&:last) if args.empty?
puts "foo is called, args are: #{args.inspect}"
impl.call(*args)
end)
C.new.foo(1,2)
#⇒ foo is called, args are: [1, 2]
# x=1 - y=2
由于您希望向方法传递任意数量的参数,lambda
应该接收splat参数。
此外,默认为impl.parameters.map(&:last)
没有多大意义,因为默认值为 symbols [:x, :y]
。