元組型別
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}
對於具有指定 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)
請注意,超出一定大小的 NTuples 僅顯示為 NTuple{N, T},而不是擴充套件的 Tuple 形式,但它們仍然是相同的型別:
julia> Tuple{Int,Int,Int,Int,Int,Int,Int,Int,Int,Int}
NTuple{10,Int64}