我想在我的函数定义中使用函数参数的子类型。这可能吗?例如,我想编写类似:我可以在函数定义中使用函数参数的子类型吗?
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!")
第本质上是一个鸭打字的解决方案。第二步在第一步中执行相应的错误检查。
哪个是首选?还是有没有第三个更好的解决方案,我不知道?
非常有用的答案 - 我学到了很多。非常感谢。 –