我不認爲是這樣朱莉婭運營商,但它可能會很容易寫,做同樣的檢查功能:
strictSubType{T,U}(::Type{T}, ::Type{U}) = T <: U && T != U # note: untested!
然而,我不得不懷疑你的使用情況。如果你真的想要的是類似的東西
function my_func{T<:String}(x::Vector{T}, y::Vector{T})
# handle strings
# note that String is an abstract type, inherited by e.g. ASCIIString and UTF8String
end
function my_func(x::Vector{Int}, y::Vector{Int})
# handle ints
# note that Int is a concrete type (actually an alias for either Int32 or Int64,
# depending on your platform) so no generic type parameter is necessary
end
然後寫,而不是。如果你有一些可以共享的邏輯,把它重構成單獨的方法,你可以放鬆類型參數(或者完全忽略它們)。
更新,以響應您的評論:
如果這兩種方法應該做同樣的事情,那麼你很可能使用duck typing更好,而且根本就沒有指定類型的功能參數:
funciton my_func(x, y)
# handle ints, strings and anything else that supports things you need (e.g. > and <)
end
Julia會編譯你要調用的每種類型組合的具體方法,所以你仍然會得到同樣快速的代碼;如果函數是類型穩定的,那麼它對於任何組合都會很快(請參閱Julia文檔以更全面地解釋它是如何工作的)。如果你想確保這兩個參數是向量,並且它們都是同一類型的,我建議你做對角線訊(也在文檔更徹底地解釋):
function my_func{T}(x::AbstractVector{T}, y::AbstractVector{T})
# handle stuff
end
請注意,我用AbstractVector
而不是Vector
- 這允許使用其他類型的容器,其行爲類似於T
類型的元素,最大限度地提高了其他編碼器功能的可用性。
有趣的是,謝謝你的迴應。我想我會按照你的建議,並使用我自己的功能進行檢查。關於用例,我想到的函數對於'String'或'Int'輸入都是相同的 - 這可能發生在例如函數只執行大於/小於類型比較的情況下,字符串和數字。所以寫出兩個相同的方法(僅在輸入類型上有所不同)看起來很浪費。但是,由於'Union'類型的數組可能會遇到性能問題,所以消除'Union'情況會很好...... – 2014-12-04 00:35:51
@ColinTBowers:在這種情況下,更「Julian」的方式是指定沒有類型在任何情況下 - 那麼我可以使用你指定的任何類型的函數(你甚至不知道存在),唯一需要的是實現你的函數需要的任何操作,在這種情況下比比較更大/更小。這個概念通常被稱爲[duck typing](http://en.wikipedia.org/wiki/Duck_typing),在Julia中被認爲是慣用的。 – 2014-12-05 10:01:31
@ColinTBowers我寫了一篇文章的更新來闡明我的意思。我希望它有幫助=) – 2014-12-05 10:07:43