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

如何在Ruby中自动将所有参数从一个方法转发到另一个方法?,ruby,methods,super,method-call,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 有没有办法调用方法b并自动将所有参数传递给它?(排序方式类似于调用super并自动转发所有参数)我知道一种近似方法: def method_a *args # do some stuff method_b *args end def method_b *

如果我有方法:

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

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

有没有办法调用
方法b
并自动将所有参数传递给它?(排序方式类似于调用
super
并自动转发所有参数)

我知道一种近似方法:

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。

使用
*args
如下:

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

def method_b(p1, p2)
  ...
end

您可以像处理方法a中的数组一样处理参数。

哇,这太令人讨厌了。但它是有效的

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

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

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

然后,在
方法b
的定义中,您可以设置特定数量的参数,以及它是否需要一个块。

这绝对是一种可行的方法。这两种方法将始终具有相同的参数(在我当前的情况下)。我本来希望像现在这样为了可读性而明确地命名它们,但如果这是唯一的选择,可能就不得不这么做了。我添加了一个简短的描述,说明为什么调用
super
与调用其他命名方法不同;讨厌。事实上,我对
super
magic也不太满意。这是IMO显式应该是默认选择的情况之一。您在调用方法_b时忘记使用splat运算符。不幸的是,这不会捕获关键字参数。@JörgWMittag:它将捕获关键字参数,这些参数将作为散列显示在
args
的末尾。