Julia 有两种构造命名元组的语法。
第一个语法使用括号内的键值对,没有分号。
named_tuple = (a=1, b=2, c=3)
语法的第二种形式使用初始分号。
named_tuple = (; a=1, b=2, c=3)
据我从文档中了解,两种形式都会产生相同的结果。(一个NamedTuple
对象。)
以下两种形式看上去并没有什么区别。
julia> tuple1 = (a=1, b=2, c=3)
(a = 1, b = 2, c = 3)
julia> typeof(tuple1)
@NamedTuple{a::Int64, b::Int64, c::Int64}
julia> tuple2 = (; a=1, b=2, c=3)
(a = 1, b = 2, c = 3)
julia> typeof(tuple2)
@NamedTuple{a::Int64, b::Int64, c::Int64}
似乎可以NamedTuple
通过一系列对来创建,但只有包含分号时才可以。
换句话说,此语法有效并产生预期结果
julia> tuple3 = (; :a=>1, :b=>2, :c=>3)
(a = 1, b = 2, c = 3)
julia> typeof(tuple3)
@NamedTuple{a::Int64, b::Int64, c::Int64}
另一方面,以下情况并不
julia> tuple4 = (:a=>1, :b=>2, :c=>3)
(:a => 1, :b => 2, :c => 3)
julia> typeof(tuple4)
Tuple{Pair{Symbol, Int64}, Pair{Symbol, Int64}, Pair{Symbol, Int64}}
这会产生一个Tuple
,Pair
而不是NamedTuple
。
每种形式的预期用途是什么,或者有两种不同形式的原因是什么?
语法
(a=1, ...)
和(; a=1, ...)
基本相同:两者都是命名元组构造函数。一个区别是,第二种形式允许您省略逗号,但仍然具有命名元组,而(a=1)
是赋值表达式。当然,()
是一个空元组,(;)
是一个空的命名元组。第二种形式,带有对,与 Julia 的关键字参数逻辑挂钩,该逻辑表示
f(args; :a=>1, :b=>2)
将关键字参数a=1
和b=2
传递给f
。 (当您拥有诸如 Dict 之类的符号值对的迭代器并希望将其转换为关键字时,这非常有用splat...
。)