我正在尝试编写一个函数,该函数调用几个接受命名参数的函数。我希望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 ...”可修复该错误,但是我不确定这是否是个好主意(例如,性能是否受到影响)。

最佳答案

您的解决方案是首选方式

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并在计算中使用关键字参数的值?它们的键入方式不太好,因此可能只是一件事(尽管它与特定问题并不真正相关)。

关于 Julia (Julia):使用splat传递参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28956660/

10-16 10:12