複合型
複合型(composite yypes)は、他言語におけるいわゆる「構造体」を実現する仕組みです。struct
の後に複合型の名前と所属する変数の名前(field name)を列挙します。以下の例では、変数 math
, science
, comment
をメンバとする複合型 Score
を定義しています。
julia> struct Score
math
science
comment
end
特に何も指定しない場合、各変数はどのような型でも受けつける Any
型となります。明示的に型を指定したい場合は、各メンバ名に続いてコロン(:)2つと型の名前を記述します。
julia> struct Score
math::Int
science::Int
comment::String
end
次に複合型のオブジェクトを作成してみましょう。以下のように各メンバに値を代入します。
julia> Taro = Score( 100, 90, "Very good!" )
Score(100, 90, "Very good!")
このような関数に似た構造はコンストラクタ(constructor)と呼ばれています。なお、内部的には指定した型に厳密なコンストラクタと、Any
型を受け付けて型変換を行うコンストラクタ、2種類が用意されています。
各変数へのアクセスは、ドット(.)を用いて行います。
julia> Taro.science
90
他言語における構造体との大きな違いは、複合型の各変数の値は書き換えできない(immutable)という点です。従って、以下のような書き方はエラーになります。
julia> Taro.science = 80
setfield!: immutable struct of type Score cannot be changed
書き換え可能な複合型については、次節の可変複合型を利用する必要があります。ただし、複合型に属する変数が複合型や配列といったオブジェクトである場合、ポインタ自体は書き換えられませんが、指し示す先の値を書き換えることは可能です。
可変複合型
書き換え可能な複合型(mutable composite types)は struct
の代わりに mutable struct
を使って定義します。
julia> struct Score
math::Int
science::Int
comment::String
end
julia> Taro = Score( 100, 90, "Very good!" )
julia> Taro.science = 80
80
パラメトリック複合型
複合型の各変数の型をパラメータとして与えることができます。複合体の名前の直後に型を表す名前を波括弧({})で囲んで列挙します。
julia> struct Score{T}
math::T
science::T
comment::String
end
julia> Taro = Score{Int64}( 100, 90, "Very good!" )
Score{Int64}(100, 90, "Very good!")
julia> Hanako = Score{Float64}( 99.5, 85.0, "Good!" )
Score{Float64}(99.5, 85.0, "Good!")
このような書き方は、C++におけるテンプレートとよく似ています。