😸

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フレンドリーであってほしかった。

GitHubで編集を提案

Discussion