classでデータをまとめる
classは名前付きフィールドを持つ値型です。名前や座標など、関連する値をひとまとめにするために使います。フィールドごとに名前と型を決め、値を作るときはすべてのフィールドを指定します。
class Point:
x: f64
y: f64
def distance_squared(point: Point) -> f64:
return point.x * point.x + point.y * point.y
def main():
point = Point(x=3.0, y=4.0)
print(point.x)
print(distance_squared(point))
このコードをpoint.nagiに保存し、nagic run point.nagiで実行すると、3と25を表示します。point.xでフィールドを読みます。値を処理する関数はclassの外に定義します。
Point(3.0, 4.0)のような位置引数の生成はできません。上のPoint(x=3.0, y=4.0)のように、field名を付けてください。関連するfieldを持つ値ではなく、互いに異なる種類から1つを選ぶ場合はclassではなくenumを使います。
このページの目次
値を渡すとき
数値など、コピーできる値だけを含むclassは、そのまま複数回使えます。上のPointもその一つです。List[Point]の要素をforで読むこともできます。
文字列や配列を含むclassは、関数へ渡すと所有権が移ります。渡したあとも使いたい場合は、所有権を確認してください。
対応している範囲
現在はフィールドの定義、名前付き引数による生成、フィールドの読み取りに対応しています。メソッド、継承、フィールドへの代入は未対応です。viewをフィールドに保存することもできません。
Errorやenumはフィールドに保存できます。Errorの原因を保持する独自エラーclassにも使えます。sqlite.Poolや保存可能な標準resourceも状態のフィールドにできますが、Error・enum・resourceを含むclassはJSONへ変換できません。関数型とHtmlのフィールドは未対応で、Listやnullableの中でも同じです。Mapのキーにはf32 / f64 / UUID / timestampなど、ハッシュに未対応の型を使えません。
shared[T]のフィールドは、TがJSON対応なら変換できます。JSONにはTの値を書き込み、読み込むと新しい共有値を作ります。元の値が参照を共有していた関係は、JSONには保存しません。
classはRustの構造体へ変換されます。数値だけのclassを配列に入れても、要素ごとに別の領域を確保する必要はありません。文字列や配列のフィールドには、そのデータを保存する領域が必要です。Cとの連携に使える固定のメモリ配置は定義していません。
classを自分自身のフィールドへ直接入れることはできません。Node?やResult[i64, Node]を経由しても、値のサイズが決まらないためエラーです。木構造などで子を持たせる場合は、children: List[Node]のように間接的に格納します。