View on GitHub

julia-doc

Julia入門

複合型

複合型(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++におけるテンプレートとよく似ています。