朱莉娅:使用splat传递参数

时间:2015-03-10 05:21:11

标签: julia splat

我正在尝试编写一个函数来调用几个接受命名参数的函数。我希望A函数能够在args中将参数命名为splatted,并将匹配的参数传递给它调用的函数。

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"

让这个工作的首选方法是什么?将“args ...”添加到B的参数列表中可以修复错误,但我不确定这是不是一个好主意(例如是否有任何性能损失)。

1 个答案:

答案 0 :(得分:3)

您的解决方案是首选方式

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并在计算中使用关键字参数的值吗?它们打印得不是很好,所以这可能是唯一的事情(虽然它与具体问题并不相关)。

相关问题