朱莉娅:使用splat传递参数

6

我正在尝试编写一个函数,它调用多个接受命名参数的函数。我希望A函数能够将参数以args形式汇总,并将匹配的参数传递给它所调用的函数。

function A(x, y; args...)
  B(x; args...)
  C(y; args...)
end
function B(x; a=0)
  println(x,a)
end
function C(y; a=0, b=0)
  println(y,a,b)
end

funcA(1, 2) # Works
funcA(1, 2, a=1) # Works
funcA(1, 2, a=1, b=1) # Error: unrecognized keyword argument "b"

如何让这个工作成为首选方案?在B的参数列表中添加"args..."可以修复错误,但我不确定这是否是一个好主意(例如,是否存在任何性能损失)。

1个回答

4

您的解决方案是首选方式

function A(x, y; args...)
  B(x; args...)
  C(y; args...)
end
function B(x; a=0, _...)  # catch rest
  println(x,a)
end
function C(y; a=0, b=0)
  println(y,a,b)
end

A(1, 2) # Works
A(1, 2, a=1) # Works
A(1, 2, a=1, b=1) # Works

对于_没有特殊含义,使用任何你感觉最好的方式即可。

至于性能方面,我怀疑这不会被注意到。你是否在一个热循环中多次调用B并在计算中使用关键字参数的值?它们的类型不是很好,所以这可能是唯一的问题(尽管与具体问题无关)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接