在 Julia 中构造命名元组的两种语法形式有什么区别?

问题描述 投票:0回答:1

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

每种表格的预期目的是什么,或者有两种不同表格的原因是什么?

julia namedtuple
1个回答
0
投票

语法

(a=1, ...)
(; a=1, ...)
基本相同:都是命名元组构造函数。一个区别是,第二种形式允许您省略逗号,但仍然有一个命名元组,而
(a=1)
是一个赋值表达式。另外,当然
()
是一个空元组,而
(;)
是一个空命名元组。

第二种形式是成对的,它与 Julia 的关键字参数逻辑挂钩,即

f(args; :a=>1, :b=>2)
将关键字参数
a=1
b=2
传递给
f
。 (当您有一个符号值对的迭代器(例如 Dict)并且想要将其
splat...
转换为关键字时,这非常有用。)

© www.soinside.com 2019 - 2024. All rights reserved.