Ruby将参数传递给方法

时间:2017-04-16 08:07:12

标签: ruby

我想在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])。有人可以告诉我如何避免这个问题吗?

1 个答案:

答案 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]