设置:在Julia中考虑参数类型
type MyType1{T1}
x::T1
end
我使用多个调度和类型参数为此类型的单个函数定义了两个方法:
f1(m::MyType1, i::Int64) = m.x + i #Method 1
f1{T1}(m::MyType1, i::T1) = m.x + i + 1 #Method 2
方法1对应于第二输入为Int64
的情况。方法2对应于第二输入是参数的情况。我使用MyType1
创建m=MyType1{Int64}(1)
的实例,并注意m.x
现在返回1
。
问题1:我见证了以下行为:
In : f1(m, 1.0)
Out : 3.0
好的,所以我没有在函数调用中提供有关T1
的任何信息。似乎Julia推断它应该执行方法2,理由是第二个输入不是 Int64
。事实上这些事情是如何在幕后工作的吗?
问题2:假设我想调用第二种方法,但第二种方法是Int64
。显然f1(m, 1)
将不起作用,因为它将调用第一种方法。我试过这个:
In : f1{Int64}(m, 1)
但朱莉娅抛出了这个错误:
ERROR: type: instantiate_type: expected TypeConstructor, got Function
是否可以使用指定为Int64
的第二个输入来运行第二个方法,或者我是愚蠢的?
答案 0 :(得分:3)
首先,我想知道你是否打算将第二个方法中的第一个参数输入为m::MyType1{T1}
,例如
f1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1 #Method 2b
这意味着仅当i
与T1
类型m
的类型参数具有相同类型时,第二种方法才适用。根据您的原始定义,T1
只会匹配实际参数i
所具有的任何类型,因此您也可以将其编写为f1(m::MyType1, i::Any) = ...
。
1)使用方法2b而不是方法2,我得到了
julia> f1(m, 1.0)
ERROR: no method f1(MyType1{Int64}, Float64)
因为没有适用的方法。
在原始情况下,方法1不适用,但方法2适用。 Julia选择了最具体的方法,例如:方法2.是的,您可以说方法2被选中,因为第二个输入不是Int64
。
2)显式类型参数(至少到目前为止)仅支持类型,而不支持函数调用。 invoke
函数允许调用指定的函数并根据给定(更一般)的参数类型列表选择方法,但我不确定是否适用于MyType{Int64}
,两种方法适用于第二个参数完全相同的类型。无论哪种方式,不建议使用invoke
是一般的,我认为它可以给予相当大的性能损失。
如果你真的希望能够在这种情况下调用方法2,你应该找到另一种方法,你不必打多次派遣。一种选择是将方法2的实现拉出到它自己的函数中,例如
f1(m::MyType1, i::Int64) = m.x + i #Method 1
f1{T1}(m::MyType1{T1}, i::T1) = g1(m, i) #Method 2b
g1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1
如果您想使用第二种方法,可以直接致电g1
。
顺便说一下,您使用Int64
的任何具体原因?除非您明确需要64位,否则使用Int
(根据您的系统将其类型化为Int32
或Int64
)更多Julian并且倾向于与其他代码更好地互操作。< / p>