付録A: キーワード
以下のリストは、現在、あるいは将来Rust言語により使用されるために予約されているキーワードです。 そのため、識別子として使用することはできません。識別子には、関数名、変数名、引数名、構造体のフィールド名、モジュール名、クレート名、定数名、マクロ名、静的な値の名前、属性名、型名、トレイト名、ライフタイム名などがあります。 ただし、生識別子のところで議論する生識別子は例外です。
現在使用されているキーワード
以下のキーワードは、解説された通りの機能が現状あります。
as- 基礎的なキャストの実行、要素を含む特定のトレイトの明確化、useやextern crate文の要素名を変更するasync- 現在のスレッドをブロックする代わりにFutureを返すawait-Futureの結果が準備できるまで実行を停止するbreak- 即座にループを抜けるconst- 定数要素か定数の生ポインタを定義するcontinue- 次のループの繰り返しに継続するcrate- 外部のクレートかマクロが定義されているクレートを表すマクロ変数をリンクするelse-ifとif let制御フロー構文の規定enum- 列挙型を定義するextern- 外部のクレート、関数、変数をリンクするfalse- bool型のfalseリテラルfn- 関数か関数ポインタ型を定義するfor- イテレータの要素を繰り返す、トレイトの実装、高階ライフタイムの指定if- 条件式の結果によって条件分岐impl- 固有の機能やトレイトの機能を実装するin-forループ記法の一部let- 変数を束縛するloop- 無条件にループするmatch- 値をパターンとマッチさせるmod- モジュールを定義するmove- クロージャにキャプチャした変数全ての所有権を奪わせるmut- 参照、生ポインタ、パターン束縛で可変性に言及するpub- 構造体フィールド、implブロック、モジュールで公開性について言及するref- 参照で束縛するreturn- 関数から帰るSelf- 定義しようとしている・実装(implement)しようとしている型の型エイリアスself- メソッドの主題、または現在のモジュールstatic- グローバル変数、またはプログラム全体に渡るライフタイムstruct- 構造体を定義するsuper- 現在のモジュールの親モジュールtrait- トレイトを定義するtrue- bool型のtrueリテラルtype- 型エイリアスか関連型を定義するunsafe- unsafeなコード、関数、トレイト、実装に言及するuse- スコープにシンボルを持ち込むwhere- 型を制限する節に言及するwhile- 式の結果に基づいて条件的にループする
将来的な使用のために予約されているキーワード
以下のキーワードには機能が何もないものの、将来的に使用される可能性があるので、Rustにより予約されています。
abstractbecomeboxdofinalmacrooverrideprivtrytypeofunsizedvirtualyield
生識別子
生識別子 とは、普段は使うことが許されないキーワードを使わせてくれる構文です。
生識別子はキーワードの前にr#を置いて使うことができます。
たとえば、matchはキーワードです。
次の、名前がmatchである関数をコンパイルしようとすると:
ファイル名: src/main.rs
fn match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
// 訳注: 引数名は、"a needle in a haystack" すなわち「干し草の中の針」という、
// 「見つかりそうにない捜し物」を意味する成句からもじった命名。
// 検索をする関数でよく使われる。
次のエラーを得ます:
error: expected identifier, found keyword `match`
--> src/main.rs:4:4
|
4 | fn match(needle: &str, haystack: &str) -> bool {
| ^^^^^ expected identifier, found keyword
このエラーはmatchというキーワードを関数の識別子としては使えないと示しています。
matchを関数名として使うには、次のように、生識別子構文を使う必要があります。
ファイル名: src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool { haystack.contains(needle) } fn main() { assert!(r#match("foo", "foobar")); }
このコードはなんのエラーもなくコンパイルできます。
r#は、定義のときも、main内で呼ばれたときにも、関数名の前につけられていることに注意してください。
生識別子を使えば、仮にそれが予約されたキーワードであろうとも、任意の単語を識別子として使えるようになります。
更に、あなたのクレートが使っているRustのeditionとは異なるeditionで書かれたライブラリを呼び出すこともできるようになります。
たとえば、tryは2015 editionではキーワードではありませんでしたが、2018 editionではキーワードです。
もし、2015 editionで書かれており、try関数を持っているライブラリに依存している場合、あなたの2018 editionのコードからその関数を呼び出すためには、生識別子構文を使う必要がでてくるでしょう。今回ならr#tryですね。
editionに関して、より詳しくは付録 Eを見てください。