😸
Juliaの関数呼び出しにおけるsplat
splat(...)を使ったときに意外な挙動をしたのでメモ。
tldr
;をいれないと、(例え前にkeyword argumentがあっても)positional argumentとしてsplatしようとする。
おまけ
- keyword argumentでkeyが被ると後の方で上書きする。
-
NamedTupleをpositional argumentとしてsplatすると値だけが残る。
例
julia> function f(args...; kw...)
@show args
@show kw
nothing
end
f (generic function with 1 method)
julia> f(a = 1)
args = ()
kw = Base.Pairs(:a => 1)
julia> f(a = 1, (; b = 2)...)
args = (2,)
kw = Base.Pairs(:a => 1)
julia> f(; a = 1, (; b = 2)...)
args = ()
kw = Base.Pairs(:a => 1, :b => 2)
julia> f(Dict(:a => 1)...)
args = (:a => 1,)
kw = Base.Pairs{Symbol, Union{}, Nothing, @NamedTuple{}}()
julia> f(; Dict(:a => 1)...)
args = ()
kw = Base.Pairs(:a => 1)
julia> f(a = 1, 2)
args = (2,)
kw = Base.Pairs(:a => 1)
よくよく考えたら最後のができるので自明かもですね。
間違えると普通はmethod errorになるんですが、Makieのような複雑な関数呼び出しをする場合だとエラーも難解になります。
最近JETLSを使っててpropertyやkeyword argumentの補完が出るのに感動してるんですが、MakieももっとJETLSフレンドリーであってほしかった。
Discussion