2017-04-26 14 views
2

檢查時複雜類型由於一些複雜的對象,如:標示不足的朱莉婭

> d = Dict(("a", "b")=>3, ("c", "d")=>2) 
Dict{Tuple{String,String},Int64} with 2 entries: 
    ("c","d") => 2 
    ("a","b") => 3 

我可以檢查類型:

> isa(d, Dict{Tuple{String, String},Int64}) 
true 

但是,當我underspecify元組類型,它沒有通過檢查:

> isa(d, Dict{Tuple,Int64}) 
false 

是否可以檢查未指定的類型在朱莉婭?如果是這樣,怎麼樣?如果不是,爲什麼?

回答

3

在Julia中,字典與數組一樣是不變的。例如,關於適用於數組的概念,請參閱this question

這意味着:

julia> Int <: Number 
true 

但是,

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

同樣,

julia> Dict{Int, String} <: Dict{Number, String} 
false 

但是,請注意Dict自身是抽象的,所以

julia> Dict{Int, String} <: Dict 
true 

和您提供的代碼,

julia> isa(d, Dict) 
true 

據我知道,如果你想了解你的字典中對各類具體的原因,你需要明確引用它們。您可以使用keytype(d)valtype(d)來完成此操作。例如,從你的問題,注意

julia> keytype(d) <: Tuple 
true 

當然,如果你的字典傳遞給函數,那麼您可以在函數簽名使用Dict{T1, T2},然後只是推理T1T2 ...

編輯:見@ FengyangWang的一個整潔的小語法快捷答案V0.6引入

1

在朱莉婭0.6,你可以簡單地做

isa(d, Dict{<:Tuple, Int64}) 

這意味着密鑰類型爲Tuple的子類型和值類型Int64Dict

請注意,Dict{Tuple, Int64}而不是一個「未指定」類型:它是一個具體類型,可以有實例。但是,Dict{Tuple{String, String}, Int64}不是一回事。前者是一種接受所有元組作爲鍵的類型,而後者只接受Tuple{String, String}。這是參數不變性的一個例子。