如何在 Julia 中定义我们自己的类型?

May*_*ana 0 julia

Julia> type Circle
    ERROR: syntax: extra token "Circle" after end of expression
Stack trace:
 [1] top-level scope at none:0 
Run Code Online (Sandbox Code Playgroud)

我已经尝试过 struct 方法,但它没有按要求工作。

pfi*_*seb 5

您可以使用以下命令声明新的(复合)类型struct

julia> struct Circle end

julia> Circle()
Circle()
Run Code Online (Sandbox Code Playgroud)

另请查看有关 types文档


Jef*_*off 5

假设您想要定义自己的Circle类型,并且选择通过给出圆的半径和圆心来表示圆((x, y)为简单起见。3D 坐标遵循相同的定义模式)。首先要决定的是您是否希望能够更改Circle曾经创建的某些值。假设您希望在创建后能够移动其中心。

  • 要创建具有可更改字段值的类型,我们使用mutable struct
  • 要为我们的类型定义一个字段,我们给它一个名称并指定它的类型
  • 为了构造我们类型的实现,我们使用同名的函数
mutable struct Circle
    radius::Float64
    xcoord::Float64
    ycoord::Float64
end

circle1 = Circle(inv(2pi), 0.0, 0.0)
circle2 = Circle(sqrt(2.0), 1.0, 1.0)
Run Code Online (Sandbox Code Playgroud)

然后

julia> circle1 = Circle(inv(2pi), 0.0, 0.0)
Circle(0.15915494309189535, 0.0, 0.0)

julia> circle2 = Circle(sqrt(2.0), 1.0, 1.0)
Circle(1.4142135623730951, 1.0, 1.0)

# and we can move the Circles
julia> circle2.xcoord = 0.0
julia> circle2.ycoord = 0.0
julia> circle2
Circle(1.4142135623730951, 0.0, 0.0)

# and we can change the radius if need be
julia> circle.radius = 1.0
julia> circle2
Circle(1.0, 0.0, 0.0)
Run Code Online (Sandbox Code Playgroud)

现在,我们可以做得更好(更整洁、更清晰)。我们可以选择定义 2D 点类型(或 3D 点类型),并将其用于Circle. 一旦我们有了这种类型,您可能想要加入一些装饰。

diameter(x::Circle) = 2 * x.radius
circumference(x::Circle) = pi * diameter(x)
Run Code Online (Sandbox Code Playgroud)

你可以更清楚地展示它

Base.show(io::IO, x::Circle) =
   print(io, string("Circle(radius=",x.radius, " x=",x.xcoord, " y=",x.ycoord,")"))
Run Code Online (Sandbox Code Playgroud)

然后

julia> circle2
Circle(radius=1.4142135623730951 x=0.0 y=0.0)
Run Code Online (Sandbox Code Playgroud)

对于字段值不更改的自定义类型,请遵循相同的模式替换mutable structstruct(省略mutable)。当然,还有更先进的技术可以应用,请参阅文档:

如果您有任何后续问题,请随时提出。