我有一组函数想要对某些数据使用。目前,我将这些函数存储在全局数组中以便能够对它们进行索引。
const global _rot01(x)::Tuple{Int64, Int64, Int64} = ( x[1], x[2], x[3])
const global _rot02(x)::Tuple{Int64, Int64, Int64} = ( x[2], x[3], x[1])
...
const global _rot24(x)::Tuple{Int64, Int64, Int64} = (-x[1], -x[3], -x[2])
const global Rotations = [
_rot01,
...
_rot24
]
但是,我希望优化这一点,因为我听说应该避免全局值。 switch 语句可以让我有效地选择正确的函数,但这些不可用。这个函数向量是做到这一点的唯一方法吗?这有多有效?另外,我应该用“真实”函数定义替换这些函数吗?
首先,你不需要写:
const global _rot01(x)::Tuple{Int64, Int64, Int64} = ( x[1], x[2], x[3])
定义这样的函数就足够了:
_rot01(x)::Tuple{Int64, Int64, Int64} = ( x[1], x[2], x[3])
函数默认是const。你写的是真正的函数定义。另外你不需要写
::Tuple{Int64, Int64, Int64}
(除非你知道你需要强制转换数据),只需要写:就足够了
_rot01(x) = ( x[1], x[2], x[3])
除非
x
是一些奇怪的数据结构(例如 Any
的向量),否则 Julia 会自动检测函数的返回类型。
第二名:
const global Rotations = [
_rot01,
...
_rot24
]
你不需要写
global
(我知道你正在全局范围内定义Rotations
)。
相反,我认为写得不错的是:
const global Rotations = (; _rot01, ... _rot24)
这将您定义为
Rotations
作为命名元组,然后您可以通过以下方式访问它:
Rotations[1]
或
Rotations._rot01
得到第一个函数,效率会很高。
如果你不喜欢它,那么做一个元组:
const global Rotations = (_rot01, ... _rot24)
也可以(但是您只能通过索引进行访问,而不能通过名称进行访问)。
现在为什么定义:
const Rotations = [
_rot01,
...
_rot24
]
不好。原因是,该向量的元素类型将是
Function
,这意味着您的代码将不稳定,因为 Function
是抽象类型(与专门化其字段类型的 Tuple
或 NamedTuple
相反) )。并且输入无法的代码会导致性能下降。
最后,
如果您想从全局范围访问它,只需将
Rotations
定义为 const
即可。但如果你想将它传递给函数,只需将其定义为普通变量并作为函数参数传递就完全可以,事情会很快。
我知道我的回答触动了很多东西。如果有什么需要进一步澄清,请评论。