【发布时间】:2017-03-19 23:10:33
【问题描述】:
通常人们想要严格定义他们的类型,同时对方法留下宽松的类型限制(因为后者会自动专门化,因此没有性能提升)。因此我知道对于定义函数,使用::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。那么,如果您想内联函数(并且这些类型“几乎是恒定的”),那么第二个会更好,如果您要大量更改函数,第一个会更好吗?还是我想多了?
【问题讨论】:
-
我个人会更进一步,推荐
Any而不是Base.Callable,以捕捉Polynomial之类的情况。 -
是的,这些都是权衡。不知道除此之外还有其他答案。