Julia-类型的备用字段名

Julia-类型的备用字段名,julia,Julia,如果我有一种叫做测量的类型 type Measurements x y z end 其中x表示宽度、y高度和z深度 然而,在某些情况下,其他类型的含义可能不那么清楚。有什么办法可以让我两个都打电话吗 julia> m = Measurements(10,5,12); julia> m.x 10 julia> m.width 10 f、 像这样 julia> Base.getfield(m::Measurement, width) =

如果我有一种叫做测量的类型

type Measurements
    x
    y
    z
end 
其中x表示宽度、y高度和z深度

然而,在某些情况下,其他类型的含义可能不那么清楚。有什么办法可以让我两个都打电话吗

julia> m = Measurements(10,5,12);

julia> m.x
 10

julia> m.width
 10
f、 像这样

julia> Base.getfield(m::Measurement, width) = m.x
返回错误

ERROR: cannot add methods to a builtin function

这些评论建议了一些方法来获得更好的字段访问,而@DNF建议使用访问器函数(setters/getter)是一种很好的封装模式。Julia语言允许的另一个选项是定义:

Base.getindex(v::Measurements,s::Symbol) = s==:width ? v.x : s==:height ? v.y : s==:depth ? v.z : throw(BoundsError(s))
那么


工作。这够简单吗?同样,可以添加更多别名。可能会涉及一些较小的运行时成本,因此热循环应该使用基于
的访问。

Julia中还不存在此功能。有关此主题的详细讨论,请参阅此问题。让
width
成为一个函数怎么样?对于这种特殊情况,是的,但我有线性规划解决方案类型,其中的字段需要称为solution,dual,objective以及w,f,y etcI认为,通常建议通过函数/方法而不是通过直接字段访问来定义类型的接口。如果您将
解决方案
等定义为方法,那么字段的名称就无关紧要了。啊,我明白了,您知道这背后是什么原因(性能、可读性…)还是习惯性的?这有点难测试,但至少在我的一个基准测试中,这比定义
深度慢约140000倍(m:测量)=m.z
。是的,@DNF的解决方案也更为惯用。实际上,我想知道我的基准是否在优化整个访问,这可能会产生误导。但是,尽管如此,我并不认为与定义访问器方法相比有什么优势。当然,访问器函数同样好。事实上,在某些方面更好。但从语法上来说,这是另一种选择。不是这种方法还有一个问题:如果字段具有不同的类型,那么这个getindex将不会是类型稳定的,因此可能会导致性能大大降低。
m[:width], m[:height], m[:depth]