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
。
每种形式的预期用途是什么,或者有两种不同形式的原因是什么?