通常人们想要定义他们的类型严格,同时对方法留下宽松的类型限制(因为后者将自动专门化,因此没有性能提升)。因此我知道,对于定义函数,使用::Base.Callable
是一种很好的做法。但是,在类型中存储函数时呢?
在v0.5中,Function
和Base.Callable
都是抽象类型,因此类型
type TestType
f::Base.Callable # or ::Function
end
不会严格打字。可以使用
严格键入此内容type TestType{T<:Base.Callable}
f::T
end
然后将为每个函数生成不同的类型。
不同方法有哪些优点和缺点?看起来第二种方法会导致任何g(t::TestType)
为每个输入函数重新编译,而第一种方法不会严格键入f
。如果你想内联函数(并且这些类型是&#34;非常不变&#34;)那么第二个会更好吗?如果你要更改函数,第一个会更好吗?或者我是否想过这个?
答案 0 :(得分:4)
就我个人而言,我更喜欢参数化版本,因为它更通用。如果您有参数化类型,那么TestType{Any}
或TestType{Function}
很简单,这些类型的行为与未参数化的TestType
完全相同。
例如,Base
有Vector{T}
,可用于Vector{Any}
等特定情况和Vector{Int}
等特殊情况,您也可以{ {1}}对TestType{T}
或TestType{Any}
都有用。