我想在我的函數定義中使用函數參數的子類型。這可能嗎?例如,我想編寫類似:我可以在函數定義中使用函數參數的子類型嗎?
g{T1, T2<:T1}(x::T1, y::T2) = x + y
這樣g
將任何x::T1
進行限定,應當是T1
亞型任何y
。顯然,如果我知道,例如,T1
將始終爲Number
,那麼我可以寫g{T<:Number}(x::Number, y::T) = x + y
,這將工作正常。但是這個問題是在運行時才知道T1
的情況。
閱讀,如果你想知道爲什麼我會想這樣做:
的什麼,我試圖做的是有點麻煩,但接踵而來的是一個簡單的例子的完整描述。
我有一個參數化的類型,以及定義在該類型的簡單方法:
type MyVectorType{T}
x::Vector{T}
end
f1!{T}(m::MyVectorType{T}, xNew::T) = (m.x[1] = xNew)
我也有另一種類型的,具有所定義的抽象超類型如下
abstract MyAbstract
type MyType <: MyAbstract ; end
創建MyVectorType
的一個實例,其矢量元素類型設置爲MyAbstract
使用:
m1 = MyVectorType(Array(MyAbstract, 1))
我現在想要在MyVectorType
中放置MyType
的實例。我可以做到這一點,因爲MyType <: MyAbstract
。然而,我不能這樣做,因爲f1!
,因爲功能定義意味着xNew
必須是T
類型,而T
將是MyAbstract
,而不是MyType
。
兩個解決方案,我能想到的這個問題是:
f2!(m::MyVectorType, xNew) = (m.x[1] = xNew)
f3!{T1, T2}(m::MyVectorType{T1}, xNew::T2) = T2 <: T1 ? (m.x[1] = xNew) : error("Oh dear!")
第本質上是一個鴨打字的解決方案。第二步在第一步中執行相應的錯誤檢查。
哪個是首選?還是有沒有第三個更好的解決方案,我不知道?
非常有用的答案 - 我學到了很多。非常感謝。 –