元組型別
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}}
是包含任意數量的 Int
s 的所有元組的型別,可能為零:
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}}
接受由字串組成的元組,後跟任何數字(可能為零)的 Int
s。
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,這就是為什麼在上面的 Vararg
s 中接受任意數量的 Int
s。)以指定的 Vararg
結尾的 Tuple
型別將自動擴充套件為所請求的數量元素:
julia> Tuple{String,Vararg{Int, 3}}
Tuple{String,Int64,Int64,Int64}
對於具有指定 Vararg
:NTuple{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)
請注意,超出一定大小的 NTuple
s 僅顯示為 NTuple{N, T}
,而不是擴充套件的 Tuple
形式,但它們仍然是相同的型別:
julia> Tuple{Int,Int,Int,Int,Int,Int,Int,Int,Int,Int}
NTuple{10,Int64}