アイテムはモジュールに属する宣言です。関数、型、定数、static、実装、モジュール、インポートがあります。アイテムはファイルの最上位、インラインモジュール、ブロック(ブロック内のアイテムを参照)に置けます。関数と定数は impl の中にも置けます。
概要
| アイテム | 形 | 参照 |
|---|---|---|
| 関数 | fn f() {}、const fn f() {}、pushdown fn f() {} | 関数 |
| 構造体 | struct Point { x: i32, y: i32 }、struct Id(u32);、struct Marker; | 構造体 |
| 列挙型 | enum Route { None, Hanako, Azusa } | 列挙型 |
| 定数 | const HANAKO: EntityId = EntityId(216); | 定数 |
| 物語変数 | static mut ROUTE: Route = Route::None; | 物語変数 |
| ハンドル | static MUSIC: Setting<Volume> = setting(volume(60)); | ハンドル |
| 型エイリアス | type Pair<T> = (T, T); | 型エイリアス |
| 実装 | impl Point { … } | 実装 |
| モジュール | mod story;、mod ui { … } | ソースファイルとモジュール |
| インポート | use story::Day1; | use 宣言 |
アイテムの一般的な形は次のとおりです。
Item = Attribute* "pub"? ItemBodyAttribute = "#" "[" Path "]"アイテムは宣言より前で使えます。ファイル内のアイテムの順序に意味はありません。
構造体
struct Point { x: i32, y: i32 } // record structstruct Affection(Int<0, 5>); // tuple structstruct Marker; // unit structstruct Pair<T> { a: T, b: T } // generic struct- レコード構造体は名前付きのフィールドを持ち、
Point { x: 1, y: 2 }で作ります。 - タプル構造体は番号付きのフィールドを持ち、
.0、.1… でアクセスします。その名前はコンストラクタ関数でもあり、Affection(3)のように使います。コンストラクタはconst fnで、const fn(…) -> …型の関数ポインタの値として使えます。 - ユニット構造体はフィールドを持ちません。その名前が唯一の値です。
- 構造体は型や定数についてジェネリックにできます。ジェネリクスを参照してください。
where節やジェネリクス引数の既定値はありません。 - フィールドには
pubや属性を付けられます。コンパイラは現在フィールドの可視性を検査しません。可視性を参照してください。 deriveはありません。等価性は自動です。等価性を参照してください。
列挙型
enum Route { None, Hanako, Azusa }
enum Ending { Normal, Good(Int<0, 3>), Bad { reason: Route },}- バリアントは、構造体の 3 つの形と同じく、ユニットバリアント、タプルバリアント、レコードバリアントのいずれかです。
- バリアントはインポートしない限り
Route::Hanakoのように列挙型を通して指定します。use Route::*;ですべてのバリアントをインポートできます。OptionとResultのバリアントはプレリュードにあります。 - タプルバリアントの名前は、タプル構造体の名前と同じくコンストラクタ関数です。
Ending::Good(2)のように使います。 - 明示的な判別値(
A = 1)は構文エラーです。列挙型は数値を持ちません。数値への変換にはmatchを使います。 - どのバリアントもデータを持たない列挙型はフィールドなし列挙型です。フィールドなし列挙型は
RandChooseを実装し、choice!のアームの値になります。
定数
const HANAKO: EntityId = EntityId(216);const MAX_AFFECTION: Int<0, 100> = 5 * 20;const ROOF: ImageAsset = asset("bg/roof.png");- 型は必須です。
- 初期化子は定数式でなければなりません(
E3010)。値はコンパイラが計算します。値のない定数はE1011です。 - 型に参照を含めることはできません(
E3012)。 - 定数は、その型にかかわらず物語の中を含めどこでも使えます。値がコンパイル時にわかっているからです。
- 定数は
implの中(関連定数。Point::ORIGINやSelf::ORIGINとして使います)やブロックの中にも置けます。 - 定数の初期化子は
constのコードとして検査され、const fnだけを呼べます。
static
static は、ゲームの実行全体を通じて 1 つの場所を持つ値を宣言します。用途はちょうど 2 つで、コンパイラは mut の有無で区別します。
物語変数
static mut ROUTE: Route = Route::None;static mut AFFECTION_MIO: Int<0, 5> = 0;static mut は物語変数です。物語の状態であり、物語とともにセーブ・復元されます。
意味については物語変数を参照してください。
ハンドル
static MUSIC: Setting<Volume> = setting(volume(60));static CLEARED_AZUSA: Meta<bool> = meta(false);不変の static はハンドルで、Setting<T> か Meta<T> を保持します(E3011)。初期化子は定数を引数とする setting(…) か meta(…) の呼び出しです。これらの呼び出しは static の初期化子でしか使えません(E4007)。普通の定数には const を使います。設定とメタはゲームシステムで説明します。
型エイリアス
type Pair<T> = (T, T);type Board = Square<8>;型エイリアスは型に別の名前を付けます。新しい型は作りません。ジェネリックにできます。型のないエイリアスは E1011、自分自身に展開されるエイリアスは E2010 です。構造体や列挙型のエイリアスを通して関連アイテムを指定でき、impl の対象にもできます。Board::new() のように使います。
実装
struct Square<const N: u64> { side: u64,}
impl<const N: u64> Square<N> { const CELLS: u64 = N * N;
pub const fn new() -> Self { Self { side: N } }
pub const fn cells(&self) -> u64 { self.side * Self::CELLS }}固有実装 impl Type { … } は、構造体や列挙型に関連関数と関連定数を追加します。self パラメータを持つ関数はメソッドです。メソッドと関連関数を参照してください。
- 対象は構造体か列挙型で、ジェネリクス引数を付けて書きます。
implは使うジェネリクスパラメータを宣言します(impl<T> Pair<T> { … })。標準ライブラリの構造体や列挙型も対象にできます。プリミティブ型は拡張できません(E1022)。 implの中ではSelfが対象の型です。- 関連アイテムは
pubが付いていなければプライベートです。1 つの型で同じ名前の関連アイテムが 2 つあると、別のimplブロックにあってもE1014です。 - 1 つの型に、ゲームのどのモジュールからでも複数の
implブロックを書けます。 impl Trait for Typeは標準ライブラリ専用です(E1023)。
トレイト
ユーザーのコードはトレイトを宣言せず(E1012)、実装もしません(E1023)。標準ライブラリが固定のトレイト集合を宣言し、コードはそれをジェネリクスパラメータの境界として使います(トレイト境界を参照)。各トレイトは言語トレイトで説明します。
モジュールとインポート
mod はモジュールを宣言し、use は名前をインポートします。どちらもソースファイルとモジュールで説明します。
ブロック内のアイテム
ブロックには文と並べてアイテムを置けます。そのアイテムは宣言より前を含むブロック全体と、入れ子のブロックから見えます。ブロックの外からは見えません。
fn uses() -> u64 { const STEP: u64 = 2; fn helper(x: u64) -> u64 { x + STEP } use crate::widen as w; helper(1) + w(3u8)}
fn widen<T: Integer>(value: T) -> u64 { Integer::into(value)}ブロック内のアイテムは普通のアイテムです。入れ子の関数は外側の関数のローカル変数をキャプチャせず、入れ子の const はコンパイル時に計算されます。ファイルモジュール(mod name;)はブロックの中では宣言できません(E1005)が、インラインモジュールは宣言できます。
属性
属性はアイテムの前、pub より前に #[name] と書きます。コンパイラが知っている属性は 4 つです。
| 属性 | 対象 |
|---|---|
#[scene] | pushdown fn |
#[entry] | #[scene] の関数 |
#[must_use] | 構造体または列挙型 |
#[builtin] | 標準ライブラリの関数、構造体、トレイト |
それ以外の属性は E1006、引数付きの属性(#[scene(x)])は E1007、誤ったアイテムへの属性は E3018 です。内部属性 #![…] は構文エラーです。各属性の意味は属性で説明します。
最終更新日 2026年10月29日