Types 在Julia中构造具有相关字段的类型

Types 在Julia中构造具有相关字段的类型,types,constructor,julia,Types,Constructor,Julia,我想创建一个Julia类型,其中包含相互之间具有固定关系的字段。为了说明,考虑一个点类型,它代表2个维度中的一个点,并且具有表示笛卡尔(x,y)和极坐标(r,θ)坐标的字段。这些字段必须与r*cos(θ)=x和r*sin(θ)=y相关,并且您应该能够通过指定任一坐标集来构造点。问题是:为这种类型创建构造函数的好方法是什么?如果您愿意引入“子”类型,那么您可以执行以下操作: 类型笛卡尔 x::64;y::浮动64 结束 类型极性 r::64;t::浮动64 结束 类型点 x::64;y::浮动64

我想创建一个Julia类型,其中包含相互之间具有固定关系的字段。为了说明,考虑一个点类型,它代表2个维度中的一个点,并且具有表示笛卡尔(x,y)和极坐标(r,θ)坐标的字段。这些字段必须与r*cos(θ)=x和r*sin(θ)=y相关,并且您应该能够通过指定任一坐标集来构造点。问题是:为这种类型创建构造函数的好方法是什么?

如果您愿意引入“子”类型,那么您可以执行以下操作:

类型笛卡尔
x::64;y::浮动64
结束
类型极性
r::64;t::浮动64
结束
类型点
x::64;y::浮动64
r::64;t::浮动64
结束
#二级外部构造函数
点(c::笛卡尔)=点(c.x,c.y,sqrt(c.x^2+c.y^2),atan2(c.y,c.x))
点(p::极)=点(p.r*cos(p.t),p.r*sin(p.t),p.r,p.t)
点(x::Float64,y::Float64)=点(笛卡尔(x,y))#。。。等

或者,对于Chris的评论,一种两全其美的方法是创建一个闭包生成函数,而不是一个简单的转换函数,这样一旦初始化,它就会保持状态,并且可以用来免费将转换返回到polar。

这里有一个可能的实现:

abstractcoordsys

抽象笛卡尔:如果只以一种方式存储它,并使用一个函数以另一种形式给出坐标,那该怎么办?@ChrisRackauckas一般来说(对于比我给出的点示例更复杂的类型),字段之间的关系可能很复杂,计算成本也很高。最好只计算一次,然后将它永久地与对象关联起来。这并不是那么简单,因为可能内存是更大的需求,所以它总是取决于应用程序。根据您的需要,您可以编写这些函数并在构造函数中使用它们。有什么问题吗?