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の外に定義します。
このページの目次
値を渡すとき
数値など、コピーできる値だけを含むclassは、そのまま複数回使えます。上のPointもその一つです。List[Point]の要素をforで読むこともできます。
文字列や配列を含むclassは、関数へ渡すと所有権が移ります。渡したあとも使いたい場合は、所有権を確認してください。
対応している範囲
現在はフィールドの定義、名前付き引数による生成、フィールドの読み取りに対応しています。メソッド、継承、フィールドへの代入は未対応です。viewをフィールドに保存することもできません。
関数型、Db、Html、Errorもフィールドに保存できません。Listやnullableの中に入れた場合も同じです。Mapのフィールドでは、キーにf32 / f64 / UUID / timestampなど、ハッシュに未対応の型は使えません。
shared[T]のフィールドはJSONへ変換できます。JSONにはTの値を書き込み、読み込むと新しい共有値を作ります。元の値が参照を共有していた関係は、JSONには保存しません。
classはRustの構造体へ変換されます。数値だけのclassを配列に入れても、要素ごとに別の領域を確保する必要はありません。文字列や配列のフィールドには、そのデータを保存する領域が必要です。Cとの連携に使える固定のメモリ配置は定義していません。
classを自分自身のフィールドへ直接入れることはできません。Node?やResult[i64, Node]を経由しても、値のサイズが決まらないためエラーです。木構造などで子を持たせる場合は、children: List[Node]のように間接的に格納します。