1 struct关键字
1.1 声明
struct关键字与复合类型一起引入,后跟一个字段名称的块,可选择使用 ::
运算符注释类型
struct Foobarbaz::Intqux::Float64end
- 没有类型注释的字段默认为
Any
类型,所以可以包含任何类型的值。
1.2 创建新对象
类型为 Foo 的新对象通过将 Foo 类型对象像函数一样应用于其字段的值来创建
foo = Foo("Hello, world.", 23, 1.5)
#Foo("Hello, world.", 23, 1.5)typeof(foo)
#Foo
1.3 字段名称列表——fieldnames
可以使用 fieldnames 函数找到字段名称列表。
注意fieldnames方法的参数是复合类型,不是对象
fieldnames(Foo)
#(:bar, :baz, :qux)
1.4 访问复合对象字段值
foo.bar,foo.baz,foo.qux
#("Hello, world.", 23, 1.5)
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 changedStacktrace:[1] setproperty!(x::Foo, f::Symbol, v::Int64)@ Base .\Base.jl:38[2] top-level scope@ In[129]:1
'''
2 可变复合类型
如果使用 mutable struct 而不是 struct 声明复合类型,则它的实例可以被修改
mutable struct Barbazqux::Float64endbar = Bar("Hello", 1.5)
#Bar("Hello", 1.5)bar.qux = 2.0bar
#Bar("Hello", 2.0)