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..." を追加するとエラーは修正されますが、それが良いアイデアかどうかはわかりません (たとえば、パフォーマンス ヒットはありますか)。

4

1 に答える 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 を何度も呼び出し、キーワード引数の値を計算に使用していませんか? それらはあまりうまく型付けされていないので、それは唯一のことかもしれません (ただし、特定の質問にはあまり関係ありません)。

于 2015-03-10T05:50:41.873 に答える