複合型
複合型は構造体のようなものだ。実際、struct キーワードを使って定義する。
julia> struct Point
x::Int
y::Int
end
複合型は具体型だ。
複合型を定義すると、同名のコンストラクタが作られるので、これを使って複合型の値(オブジェクト)を作ることができる。
julia> p
Point(2, 3)
julia> typeof(p)
Point
自動で作られるコンストラクタのほかに、新しいコンストラクタを定義することもできる。
次のように、Point という名前の関数を作ればいい。
julia> Point(x) = Point(x, 0)
Point
julia> Point(3)
Point(3, 0)
この例では、x座標だけを引数にとり、y座標に 0 を設定する、新しいコンストラクタを作っている。なので Point(3) とすると Point 複合型のオブジェクトが作られる。
複合型が内部に持っている変数をフィールドとよび、. 演算子でアクセスできる。
julia> p.x
2
julia> p.y
3
struct で宣言された複合型はイミュータブルなので、フィールドの値を更新することはできない。
julia> p.x = 7
ERROR: setfield!: immutable struct of type Point cannot be changed
Stacktrace:
[1] setproperty!(x::Point, f::Symbol, v::Int64)
@ Base .\Base_compiler.jl:58
[2] top-level scope
@ REPL[16]:1
フィールドを更新する必要がある場合、mutable struct キーワードを使って定義する。
julia> mutable struct PointM
x::Int
y::Int
end
julia> mp = PointM(2, 3)
PointM(2, 3)
julia> mp.x
2
julia> mp.x = 7
7
julia> mp.x
7
