如果我有方法:
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
排序,它会自动转发所有参数)
答案 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