Rustにおけるキーワードの役割一覧

概要: Rustにおけるキーワードの役割をできる限り列挙する。キーワードではないものについても一部取り上げる。

強キーワード部門

キーワード 役割
as 修飾パス <T as Tr>::foo
useとextern crateにおける別名 use foo as bar;
型の変換 x as usize
box box式 box 1
boxパターン box x
break break式 break 'a 1;
const 定数・関連定数 const X : i32 = 0;
関数型・関数宣言・関数定義 const fn f()
生ポインタ型 *const u8
continue continue式 continue 'a;
crate extern crate extern crate combine;
pub(restricted)構文 pub(crate) mod m;
else if-else if b {} else {}
if-let-else if let p = e {} else {}
enum 列挙型 enum E { ... }
extern 関数型・関数宣言・関数定義 extern "C" fn f()
外部アイテム extern "C" { ... }
extern crate extern crate combine;
false bool型の定数・パターン
fn 関数型・関数宣言・関数定義 fn f()
for トレイト実装 impl Tr for T {}
高階の関数ポインタ for<'a> fn f(&'a u8)
高階のトレイトオブジェクト・トレイト境界 for<'a> Tr<&'a T>
高階のwhere節 where for<'a> &'a [u8]: Tr<'a>
for式 for i in (0..10) {}
if if式 if b {} else {}
match腕のガード match x { Some(t) if t < 0 => { ... }, ... }
impl 実装 impl T {} impl Tr for T {}
匿名型 fn f() -> impl Fn()
in pub(restricted)構文 pub(in path::to::module) fn f();
配置構文 in place { expr }
for式 for i in (0..10) {}
let let文 let x = 0;
if let/while let式 if let Some(x) = x {}
loop loop式 loop {} 'a: loop {}
match match式 match x { Some(y) => {}, None => {}}
mod モジュール mod foo; mod foo {}
move クロージャ(ムーブキャプチャー) move |x, y| z
廃止されたムーブ参照? &move T
mut 書き換え可能な生ポインタ型 *mut T
専有参照型 &mut T
可変static static mut X : i32 = 0;
可変束縛 let (x, mut y) = (1, 2);
専有借用 &mut x
専有参照外しパターン &mut p
pub 可視性 pub pub(self) pub(super) pub(crate) pub(in path)
ref 借用パターン ref p
return return式 return return x
self 相対パス self::foo::bar
pub(restricted)構文 pub(self)
self引数 fn f(self: Box<Self>)
self引数ショートカット fn f(&self)
Self Self型引数 fn new() -> Self;
static 外部staticアイテム extern "C" { static X : u32; }
staticアイテム static X : u32 = 0;
struct 構造体 struct S {}
super 相対パス super::super::X
trait トレイト trait Tr {}
true bool型の定数・パターン
type 型別名 type A<X> = Box<Box<X>>;
関連型(トレイトまたはトレイト実装) impl Tr for T { type X = (); }
unsafe トレイト unsafe trait Send {}
関数型・関数宣言・関数定義 unsafe fn f()
実装 unsafe impl Send for T {}
unsafe式 unsafe { ... }
use インポートと再エクスポート use foo::bar;
where where節(トレイト・実装・構造体・共用体・列挙型・型別名・関数宣言・関数定義) where T: Clone
while while式 while b {}

弱キーワード部門

弱キーワードは特定の文脈でキーワードに準じる扱いを受ける識別子のことである。

キーワード 条件 役割
default impl内、 fn/type/constの前
※実装アイテムマクロ名として使えないがバグかもしれない
特殊化におけるデフォルトの実装 default fn f() { ... }
union モジュールまたはブロック内、識別子の前 共用体 union U { A(u8), B(u32) }
'static 生存期間 最小(最長)の生存期間境界

予約キーワード部門

予約キーワードは構文上の役割を持たないキーワードだが、将来に向けて部分的に実装されている場合がある。

キーワード 役割
abstract
alignof
become
do
final
macro 宣言マクロ2.0
offsetof
override
priv
proc
pure
sizeof
typeof typeof式
unsized
virtual
yield

基本型名部門

基本型名は構文上は通常の識別子であり、名前解決時に特別扱いされる。

識別子 役割
i8, i16, i32, i64, i128, isize 符号つき整数
u8, u16, u32, u64, u128, usize 符号なし整数
f32, f64 浮動小数点数
char Unicodeスカラー
bool 真理値
str UTF-8文字列

Prelude部門

preludeは既定で use されているアイテムである。現在は std::prelude::v1が使われている。

識別子 役割
Copy ムーブしてもムーブ元が有効であることを示すトレイト T: Copy
Send 他スレッドにムーブできることを示すトレイト T: Send
Sized バイト数が一定で、ポインタがthin pointerであることを示すトレイト T: ?Sized
Sync 参照を他スレッドにムーブできることを示すトレイト T: Sync
Drop デストラクタを定義するためのトレイト impl Drop for T { fn drop(&mut self) {} }
Fn &self で呼ばれるクロージャが実装するトレイト F: Fn(&[u8]) -> &u8
FnMut &mut self で呼ばれるクロージャが実装するトレイト Box<FnMut(i32) + 'a>
FnOnce self で呼ばれるクロージャが実装するトレイト F: FnOnce(i32) -> T
drop 値をその場で破棄する関数 drop(this_variable)
Box 単一の所有者をもつヒープ上のデータ Box::new([1, 2, 3])
ToOwned 別の型に複製できる型 s.to_owned()
Clone 同じ型に複製できる型 s.clone()
PartialEq 推移対称関係 x == y
PartialOrd 推移反対称関係 x < y
Eq 反射推移対称関係 x == y
Ord 全順序 x < y
AsRef 共有参照への明示的な変換 s.as_ref()
AsMut 専有参照への明示的な変換 s.as_mut_ref()
Into 明示的な変換 x.into::<io::Error>()
From 明示的な変換 (Intoの逆) impl From<T> for S { ... }
Default デフォルト値をもつ型 S { x: 1 .. Default::default() }
Iterator イテレータ for i in v.iter() {}
Extend 複数要素の一括挿入 v.extend([1, 2, 3]).iter()
IntoIterator イテレータに変換可能 for i in vec![1, 2, 3] {}
DoubleEndedIterator 両側から走査できるイテレータ for i in v.rev() {}
ExactSizeIterator 大きさの判明しているイテレータ v.iter().map(|&x| x + 1).len()
Option NoneかSomeをとる型 fn f() -> Option<i32> { ... }
Some 中身があるとき let mut x = Some(0);
None 中身がないとき let mut x = None;
Result 成功したときの結果か失敗したときのエラー内容をとる型 fn read() -> Result<T, E> { ... }
Ok 成功 { ...; Ok(()) }
Err 失敗 return Err(MyError::MysteriousError)
SliceConcatExt joinとconcat用 ["Chicken", "Egg"].join(" + ")
String 所有権のある文字列 let s = String::from("foo");
ToString to_string用 let s = 1.to_string();
Vec 所有権のある可変長配列 let x = Vec::with_capacity(100);

標準ライブラリのマクロ部門

標準ライブラリはデフォルトで #[macro_use] されるため、以下のマクロは指示なしですぐに使うことができる。

マクロ 役割
assert! falseならパニックする assert!(x < n);
assert_eq! 等しくないならパニック assert_eq!(a + b, b + a);
assert_ne! 等しいならパニック assert_ne!(i, j);
cfg! #[cfg()] のマクロ版。コンパイル時の条件次第でtrue/falseになる if cfg!(debug_assert) { ... }
column! コンパイル時行番号 println!("{}", column!());
concat! リテラルの連結 println!("{}", concat!("foo", "bar", 10));
debug_assert!
debug_assert_eq!
debug_assert_ne!
デバッグビルドでのみ有効化される assert*! マクロ
env! コンパイル環境変数展開 env!("PATH")
file! コンパイル時ファイル名 println!("{}", file!());
format! sprintf的なやつ let s = format!("{:08x}", 12345);
format_args! format!println! の内部処理
include! #include 的なやつ include!("precompiled.rs");
include_bytes! コンパイル時に外部ファイルをバイト列リテラルに変換 let icon = include_bytes!("icon.png");
include_str! コンパイル時に外部ファイルを文字列リテラルに変換 let csv = include_str!("data.csv");
line! コンパイル時行番号 println!("{}", line!());
module_path! コンパイル時モジュールパス println!("{}", module_path!());
option_env! コンパイル環境変数展開(ないかもしれない場合) option_env!("PATH")
panic! パニックする panic!("There must be a bug!");
print! printf的なやつ print!("Hello, {}!\n", name);
println! printf的なやつ+改行 print!("Hello, {}!", name);
stringify! 文字列化 println!("{}", stringify!(foo bar 0 1 # $ %));
thread_local! スレッドローカル変数の定義 thread_local! { static X : RefCell<Data> = RefCell::new(Data::new()); }
try! try構文 ? とほぼ同じ
unimplemented! パニックするが、未実装が理由のときに使うとよい
unreachable! パニックするが、本来なら到達しないはずのところで使うとよい
vec! 可変長配列の生成 vec![1, 2, 3] vec![10; 10000]
write! fprintf的なやつ write!(f, "Hello, {}!\n", name);
writeln! fprintf的なやつ+改行 writeln!(f, "Hello, {}!", name);