付録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により予約されています。
abstract
become
box
do
final
macro
override
priv
try
typeof
unsized
virtual
yield
生識別子
生識別子 とは、普段は使うことが許されないキーワードを使わせてくれる構文です。
生識別子はキーワードの前に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を見てください。