如何在Ruby中自动将所有参数从一种方法转发到另一种方法?

时间:2013-12-13 16:54:50

标签: ruby methods super method-call

如果我有方法:

def method_a(p1, p2)
  # do some stuff
  method_b(p1, p2)
end

def method_b(p1, p2)
  # do other stuff
end

有没有办法调用method_b并自动将所有参数传递给它? (按如何调用super排序,它会自动转发所有参数)

4 个答案:

答案 0 :(得分:1)

我知道一种appriximate方法:

def method_a *args
   # do some stuff
   method_b *args
end

def method_b *args
   # do other stuff
end

或在第二种方法中扩展参数:

def method_a *args
   # do some stuff
   method_b *args
end

def method_b p1, p2
   # do other stuff
end

由于super是密钥工作方法,因此ruby interperter可以将其视为与您调用的特定方法相同的参数列表。但默认调用不带参数的方法与super方法相同,只是方法名称:

method_a # calls to :method_a without arguments, not as the same argument list for the caller method.

因此,对于调用方法语法来说,它将是强大的omonim。

答案 1 :(得分:1)

考虑任意数量的参数和块的可能性,最通用的格式是:

def method_a(*args, &pr)
  # do some stuff
  method_b(*args, &pr)
end

然后,在method_b的定义中,您可以设置特定数量的参数以及是否采用块。

答案 2 :(得分:0)

像这样使用*args

def method_a(*args)
  ...
  method_b(*args)
end

def method_b(p1, p2)
  ...
end

您可以在method_a中处理类似数组的参数。

答案 3 :(得分:0)

哇,这很黑。但它有效

def fwd_call b, meth
  send(meth, *b.eval('method(__method__).parameters.map { |p| eval(p.last.to_s) }'))
end

def method1 x, y
  fwd_call(binding, :method2)
end

def method2 x, y
  x+y
end

puts method1(3, 4)
# 7