struct关键字与复合类型一起引入,后跟一个字段名称的块,可选择使用 :: 运算符注释类型
- struct Foo
- bar
- baz::Int
- qux::Float64
- end
Any 类型,所以可以包含任何类型的值。类型为 Foo 的新对象通过将 Foo 类型对象像函数一样应用于其字段的值来创建
- foo = Foo("Hello, world.", 23, 1.5)
- #Foo("Hello, world.", 23, 1.5)
-
- typeof(foo)
- #Foo
可以使用 fieldnames 函数找到字段名称列表。
注意fieldnames方法的参数是复合类型,不是对象
- fieldnames(Foo)
- #(:bar, :baz, :qux)
- foo.bar,foo.baz,foo.qux
- #("Hello, world.", 23, 1.5)
用 struct 声明的复合对象是不可变的;创建后不能修改
- foo = Foo("Hello, world.", 23, 1.5)
- #Foo("Hello, world.", 23, 1.5)
-
- foo.bar=1
- '''
- setfield!: immutable struct of type Foo cannot be changed
- Stacktrace:
- [1] setproperty!(x::Foo, f::Symbol, v::Int64)
- @ Base .\Base.jl:38
- [2] top-level scope
- @ In[129]:1
- '''
如果使用 mutable struct 而不是 struct 声明复合类型,则它的实例可以被修改
- mutable struct Bar
- baz
- qux::Float64
- end
-
- bar = Bar("Hello", 1.5)
- #Bar("Hello", 1.5)
-
-
- bar.qux = 2.0
-
- bar
- #Bar("Hello", 2.0)