構造体 Struct メモ

宣言の例

空間的な情報を入れる構造体を定義する例.

mutable struct HogeType
    gridnumber::Int
    mx::Int
    my::Int
    Δx::Float64
    Δy::Float64
    η::AbstractArray{Float64, 2}
    # Constructor
    HogeType() = new()     
end

データを読んで後から値を格納する場合は,structの前にmutableをつける.
endの前の行はコンストラクタを示しており,最も簡単な形式で書かれている.なくてもエラーにはならない.

var = HogeType()
var.mx = 50 # 代入の例.mutable structでないとエラー

コンストラクタに引数がないと,宣言した型に応じて勝手に何かの値が入る.

var = HogeType()
println(var.mx)
 9
println(var.my)
 86023

プロパティ名が存在するか

functionの内部で特定のプロパティ名があるか識別をしたいときなどに.

isdefined(var,:mx)
 true
isdefined(var,:MX)
 false

構造体の配列を作成

上述HogeTypeのn個作成したいときは,下記のどれかで宣言する.

var = Array{HogeType}(undef,n)
var = Array{HogeType,1}(undef,n)
var = Vector{HogeType}(n)

それぞれの要素で,HogeType型として使える.

var[1] = HogeType()
var[1].mx = 100

さらに,n個の配列(nは未定)をm個作成するときは

var = Vector{AbstractVector{HogeType}}(undef,m)
となる. こうすると,HogeType[m][n] の形式で使える.

構造体配列からプロパティ値の取り出し

var = HogeType()

の構造体配列から,全要素の同じプロパティ(例えばmx)を抽出するときは,

getfield.(var, :mx)

とする.
getfield(a, :mx) は a.mx と同値であるが,aが配列の場合は a.mxはエラーを返すため, getfieldをブロードキャストする.map関数を使っても良い.

構造体とabstract type

定義した構造体をグルーピングして,abstract typeのツリーにしたい場合は,先にabstract typeの名前を定義しておいて, 構造体の宣言時にその名前を使う.

# abstract type 
abstract type AbstHoge end # <:T がない場合,<:Any 
# struct
mutable struct HogeType <: AbstHoge # ここで struct A <: B のようにする
    gridnumber::Int
    mx::Int
    my::Int
    Δx::Float64
    Δy::Float64
    η::AbstractArray{Float64, 2}
    # Constructor
    HogeType() = new()     
end

Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-10-12 (Fri) 05:08:53 (11d)
Powered by PHP 5.6.21. HTML convert time: 0.048 sec.