2016-01-09 33 views
4

我想寫兩個函數具有相同的名稱,可以利用朱莉婭的多個調度設施和涉及陣列和數組陣列。朱莉婭參數函數陣列與多個調度

假設有三個輸入變量

# typeof(a) => Array{Array{T,N},1} 
a=Array[[1,2,3],[4,5,6]] 

# typeof(b) => Array{Int64,1} 
b=[1,2,3] 

# typeof(c) => Array{Array{Float64,1},1} 
c=[rand(10) for i in 1:2] 

而且我寫的兩個函數像這樣

function test(x::Array{Array}) 
    println("received an array of array => $(typeof(x))") 
end 

function test{T<:Number}(x::Array{T,1}) 
    println("received a vector. converting.....") 
    nx = Array[x] 
    test(nx) 
end 

以上方法適用於ab但不c

test(a) 
# received an array of array => Array{Array{T,N},1} 

test(b) 
# received a vector. converting..... 
# received an array of array => Array{Array{T,N},1} 

test(c) 
# LoadError: MethodError: `test` has no method matching test(::Array{Array{Float64,1},1}) 
# while loading In[37], in expression starting on line 1 

現在,如果我將函數定義更改爲x::Array{Array{Float64,1},1},這將工作。但我的問題是不是Array{Array}應該採取任何類型的數組陣列?

應該如何處理數組數組中的內部類型參數?

回答

4

是不是陣列{陣列}應該採取任何種類的數組陣列?

是和不是......它應該但不是這樣。

我想你已經知道朱莉婭的類型參數是不變的

注意Array本身就是一個參數化類型,所以你應該使用的地方Array{T}代替T<:ArrayArray{Array}

function test{T<:Array}(x::Array{T}) 
    println("received an array of array => $(typeof(x))") 
end