元組型別

typeof a 元組是 Tuple 的子型別:

julia> typeof((1, 2, 3))
Tuple{Int64,Int64,Int64}

julia> typeof((1.0, :x, (1, 2)))
Tuple{Float64,Symbol,Tuple{Int64,Int64}}

與其他資料型別不同,Tuple 型別是協變的 。Julia 中的其他資料型別通常是不變的。從而,

julia> Tuple{Int, Int} <: Tuple{Number, Number}
true

julia> Vector{Int} <: Vector{Number}
false

情況就是如此,因為 Tuple{Number, Number} 被接受,Tuple{Int, Int} 也是如此,因為它也有兩個元素,兩個元素都是數字。對於 Vector{Int}Vector{Number} 的情況並非如此,因為接受 Vector{Number} 的函式可能希望在這樣的向量中儲存浮點(例如 1.0)或複數(例如 1+3im)。

元組型別的協方差意味著 Tuple{Number}(再次與 Vector{Number} 不同)實際上是一個抽象型別:

julia> isleaftype(Tuple{Number})
false

julia> isleaftype(Vector{Number})
true

Tuple{Number} 的具體亞型包括 Tuple{Int}Tuple{Float64}Tuple{Rational{BigInt}} 等。

Tuple 型別可以包含終止 Vararg 作為它們的最後一個引數,以指示不確定數量的物件。例如,Tuple{Vararg{Int}} 是包含任意數量的 Ints 的所有元組的型別,可能為零:

julia> isa((), Tuple{Vararg{Int}})
true

julia> isa((1,), Tuple{Vararg{Int}})
true

julia> isa((1,2,3,4,5), Tuple{Vararg{Int}})
true

julia> isa((1.0,), Tuple{Vararg{Int}})
false

Tuple{String, Vararg{Int}} 接受由字串組成的元組,後跟任何數字(可能為零)的 Ints。

julia> isa(("x", 1, 2), Tuple{String, Vararg{Int}})
true

julia> isa((1, 2), Tuple{String, Vararg{Int}})
false

結合協方差,這意味著 Tuple{Vararg{Any}} 描述了任何元組。事實上,Tuple{Vararg{Any}} 只是另一種說法:

julia> Tuple{Vararg{Any}} == Tuple
true

Vararg 接受第二個數字型別引數,指示其第一個型別引數應該發生多少次。 (預設情況下,如果未指定,則第二個型別引數是可以取任何值的 typevar,這就是為什麼在上面的 Varargs 中接受任意數量的 Ints。)以指定的 Vararg 結尾的 Tuple 型別將自動擴充套件為所請求的數量元素:

julia> Tuple{String,Vararg{Int, 3}}
Tuple{String,Int64,Int64,Int64}

對於具有指定 VarargNTuple{N, T} 的同源元組,存在符號。在這種表示法中,N 表示元組中元素的數量,T 表示接受的型別。例如,

julia> NTuple{3, Int}
Tuple{Int64,Int64,Int64}

julia> NTuple{10, Int}
NTuple{10,Int64}

julia> ans.types
svec(Int64,Int64,Int64,Int64,Int64,Int64,Int64,Int64,Int64,Int64)

請注意,超出一定大小的 NTuples 僅顯示為 NTuple{N, T},而不是擴充套件的 Tuple 形式,但它們仍然是相同的型別:

julia> Tuple{Int,Int,Int,Int,Int,Int,Int,Int,Int,Int}
NTuple{10,Int64}