Chapter 6 城の設計を完了する
チャプタ3で、どうやって構造体を定義するか学びました。ここでは、構造体をどうやって初期化するかmain()
プロシージャでどの様に使っていくかについて学んでいきましょう。
次の図の様に、構造体を初期化するためのプロシージャを作ることがあります。このプロシージャは、同じモジュールで宣言されて初期化される必要があります。構造体を初期化するために使われるプロシージャの戻り値はstruct型で、初期メンバー変数値をもった構造体を返すことで初期化を行うものです。
module Bar {
struct T {
baz: u64
}
public new(m: u64) : Self.T {
return T {
baz: move(m)
};
}
}
この例では、モジュールBar
に構造体T
を定義し、new
という名前のプロシージャによって、パラメータで構造体のメンバー変数を初期化します。
new
プロシージャでは、メンバー変数baz
の値がプロシージャのパラメータm
である構造体T
を返します。
上記のコードで、6行目から8行目のコードは形式的に構造体の定義部分に似ていますが、実際にはreturn
構文の一部ですので、気をつけてください。そのため、後ろにセミコロンがあります。
main()
や他のプロシージャで構造体T
を使いたいときlet
ステートメントを使って変数をstruct型として宣言し、new
プロシージャを呼び出してそれを初期化できます。
例えば、続くコードは変数x
をメンバー変数10を持った構造体T
に初期化します。
let x: Bar.T;
x = Bar.new(10)
実習
前のチャプタで、城を作るためのいくつかの重要なプロセスについて学んでいますので、次のステップはそれらを組み合わせてmain()
プロシージャ内で城を構築しましょう。
- 構造体型のCastle変数を初期化するための、
newCastle
プロシージャをBuildCastle
モジュールに付け加えてください。このプロシージャは次のふたつのパラメータを持ちます。_name (bytearray)
:城の名前です。_SerialNum (u64)
:城のシリアルナンバーを特定します。
Note:main()
の中のname
とSerialNum
と区別するために上のパラメータ名の前にはアンダースコアをつけています。
このプロシージャはSelf.Castle
型の戻り値を持っています。
このコースの下の例に従って、二つのパラメータ(すなわち_name
と_SerialNum
)に基づいて城を初期化してください。
Tips:城の名前とシリアル番号は対応する値に初期化されます。さらに、城のレベルは1に初期化され、経済力と軍事力はracial_judgement()
プロシージャを呼んで計算された値によって初期化されます。- メインプロシージャで城の名前はユーザによって入力されます。そのため
name
パラメータは外部入力です。このケースではname
という名前のパラメータをbytearray
型でmain()
プロシージャに追加する必要があります。 main()
にcastle
変数を追加してそれを初期化してください。注意:はじめにlet
ステートメントを入れることを覚えておいてください。
- メインプロシージャで城の名前はユーザによって入力されます。そのため
Move Castle