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)