我不认为是这样朱莉娅运营商,但它可能会很容易写,做同样的检查功能:
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