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...
转换为关键字时,这非常有用。)