RustのRFC一覧 (~0500)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0500までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい

このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関係ない。いずれもrequest-for-commentの略である。

メタ

スタイル/慣習

  • RFC 0199 似たような動作で、所有権/借用の種別だけが異なるようなメソッドの命名規則を定める
  • RFC 0236 panic!/Result の使い分けの慣習を定義する、関連するメソッドの命名規則を定める
  • RFC 0240 unsafe の慣習の整理: unsafe 関数をメソッドにする条件の定義、論理的な不変条件を壊すが未定義動作を引き起こさない関数は unsafe ではなく *_unchecked と命名することを定義、その他 unsafe 関数の命名規則の定義
  • RFC 0344 関数/メソッド名が型名に言及する際の命名規則 (Prelude*RFC 0445により廃止され、Rust PR #23104により完全に不要になった)
  • RFC 0430 命名規則のケーシング(snake_case, CamelCase, etc.) と、 unwrap/into_*命名規則を定義
  • RFC 0445 拡張トレイトパターンに使うトレイトの名前を *Ext とする命名規則

ソースファイル処理と字句

  • RFC 0063 二重インクルードによる混乱を防ぐため、 mod foo; による外部ファイルの読み込みに制限をつける
  • RFC 0069 バイトリテラル b'x' とバイト列リテラル b"Foo" の導入
  • RFC 0090/0021 字句解析器をより単純にする
  • RFC 0326 文字/文字列リテラルにおいて \x00-\x7F に限定し \x80-\xFF を禁止
  • RFC 0342 abstract, final, override をキーワードとして予約する
  • RFC 0446 文字/文字列リテラル\uXXXX/\UXXXXXXXX を廃止し、 \u{XXXXXX} を導入
  • RFC 0463 将来の互換性のために、リテラル直後の識別子の字句規則を変更

構文

  • RFC 0016 属性を let 文、ブロック、式にも使えるようにする (#![feature(stmt_expr_attributes)])
  • RFC 0049 マッチ腕に属性を使えるようにする
  • RFC 0059 ~T 型と ~x 式を削除し、 Box/box で置き換える
  • RFC 0068 *T 型を *const T にリネーム
  • RFC 0071 const/static 内でも、一定条件下でブロックを使えるようにする
  • RFC 0087 トレイトオブジェクトの追加の境界を &(Foo : Send + Sync) ではなく &(Foo + Send + Sync) のように指定するようにする
  • RFC 0092 iffor などのブロックと紛らわしい場面では構造体の {} を禁止する
  • RFC 0132 UFCS (<T as Trait>::sth / <T>::sth) の導入
  • RFC 0135 where 節の導入 (一部未実装)
  • RFC 0160 if let 構文
  • RFC 0164 スライスパターンをfeature gateにする
  • RFC 0168 {mod, ..} によりモジュール自体とその中身を同時にインポートする (RFC 0532により廃止)
  • RFC 0169 use baz = foo::bar; 構文を廃止し use foo::bar as baz; で置き換える
  • RFC 0179 &p パターンを &p&mut p パターンに分割し、参照のミュータビリティーに応じて使い分けるようにする
  • RFC 0184 foo.0 のように、タプル/タプル構造体のフィールドに整数でアクセスできるようにする
  • RFC 0194 #[cfg(...)] の構文の整理
  • RFC 0198 foo[]/foo[n..m]/foo[n..]/foo[..n] のためのトレイト Slice/SliceMut を導入 (RFC 0439により廃止: foo[]foo[..] になり、 ..[] と独立な構文になった)
  • RFC 0202 [x, ..ys] パターンを [x, ys..] に変更 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)
  • RFC 0214 while let 構文
  • RFC 0218 空のレコード構造体 struct A {} を許可
  • RFC 0243 e?(do) catch {} 構文によるエラー処理 (RFC 1859も参照。catch構文は#![feature(catch_expr)])
  • RFC 0339 バイト列リテラルの型を &'static [u8] から &'static [u8; N] に変更
  • RFC 0418 enum のバリアントをレコード形式 (enum Foo { Bar {}}) で宣言する機能を安定化
  • RFC 0438 型における &+ の優先順位を変更し、 &(Foo + Bar) のように書くようにする
  • RFC 0450 RFC 0184 (foo.0), RFC 0160 (if let), RFC 0214 (while let) の安定化, TupleN トレイトの廃止
  • RFC 0469 box p パターンをfeature gateにし、安定化するまで使用を禁止
  • RFC 0490 Sized? T 記法を T: ?Sized に変更

マクロ

  • RFC 0085 パターンの位置でマクロを使えるようにする
  • RFC 0378 文マクロには {} または ; を必須とし、どちらも持たないマクロは式マクロとして解釈する
  • RFC 0453 マクロのエクスポート (#[macro_export]/#[macro_reexport]/#[macro_use])、 $crate メタ変数、プラグインのための #[plugin] 属性

モジュール・名前解決・可視性

  • RFC 0001 構造体フィールドの可視性をデフォルトでprivateにする。
  • RFC 0003 未使用の属性のチェック方法を改善する
  • RFC 0026 enum のバリアントの可視性を常にpublicにし、 priv キーワードを廃止する。
  • RFC 0109 バージョン込みでcrateを指定できるcrate idを廃止して、ソースコードレベルではcrateの名前だけを指定するようにする
  • RFC 0116 use/let 等による同レベルシャドウイングの廃止 (現在はglob importの復活により、globのshadowingが可能)
  • RFC 0136 publicな定義の型にprivateな型を使うのを禁止する
  • RFC 0155 固有実装は該当の型と同じモジュールでのみ可能 (RFC 0735により廃止)
  • RFC 0234 enum のバリアントは常に値名前空間と型名前空間の両方に属するようにする
  • RFC 0385 モジュールシステムの整理: use/mod 順の強制を廃止、pub extern crate を許可、 extern crate のブロック内の出現を許可
  • RFC 0390 バリアントを enum名前空間の中に移動する。つまり、 enum Foo { Bar }Bar ではなく Foo::Bar とアクセスする
  • RFC 0459 impl とその中の fn の間での、生存期間変数と型変数のシャドウイングを禁止

型システム

  • RFC 0019 既定実装 impl Send for .. {}, 否定実装 impl !Send for T {} により Send/Sync をライブラリレベルで実現する (#![feature(optin_builtin_traits)])
  • RFC 0034/0011 struct/enum の型引数に境界 T: Trait を書けるようにし、それが充足されていることを利用側で検査する。
  • RFC 0048 トレイト周りの整理: self の一般化、coherence条件の整理、トレイト選択アルゴリズムの改善など
  • RFC 0111 IndexIndex/IndexMut に分割する
  • RFC 0112/0033 Box<T> から &mut T への型強制の廃止(DerefMut型強制とは別) (RFC 0139も参照)
  • RFC 0115 整数リテラル型がデフォルトで isize にフォールバックしないようにする (RFC 0212により廃止)
  • RFC 0139 Box<T> から &T への型強制の廃止 (Deref型強制とは別) (RFC 0112も参照)
  • RFC 0195 関連型・関連定数・関連生存期間 (関連生存期間は未実装)
  • RFC 0212 RFC 0115をリバートするが、整数型のデフォルトは isize ではなく i32 にする
  • RFC 0213 fn/impl でもデフォルト型引数を使えるようにする。_ を型引数のデフォルト値の意味で使えるようにする (#![feature(default_type_parameter_fallback)])
  • RFC 0241 Deref型強制: &Rc<T>&T に自動変換等
  • RFC 0255 トレイトにobject-safetyを課すようにする
  • RFC 0341 virtual構造体と継承 virtual struct Foo {} struct Bar : Foo {} の削除
  • RFC 0401 型強制とキャストの整理: スライスへの自動参照の削除、生ポインタ型強制、サブトレイト型強制、unsizedタプル型強制、推移的型強制、ユーザー定義型のunsize型強制など (RFC 0982, RFC 1558も参照; いくつかの機能は未実装)
  • RFC 0447 未使用だったり、一意でないような impl の型引数を禁止
  • RFC 0495 スライスパターン [x, xs..] の変更: [T] にはマッチするが &[T] にはマッチしない。可変借用の分割に対応 (#![feature(slice_patterns)]/#![feature(advanced_slice_patterns)] に注意)

クロージャ

  • RFC 0114 クロージャの整理: unboxed closureのための Fn/FnMut/FnOnce トレイトの導入、 proc の削除、クロージャ型を削除して |_| -> _ を構文糖衣に変更(構文糖衣はRFC 0231により廃止)、キャプチャー方式の指定、レシーバモード |:| |&:| |&mut :| の明示(RFC 0231により廃止)
  • RFC 0151 クロージャref を指定しない限りムーブキャプチャーする (RFC 0231により廃止)
  • RFC 0231 キャプチャーモードの推論方式を変更、 ref || を廃止して move || を導入、 |_| -> _ 型構文を廃止、レシーバモード |:| |&:| |&mut :| を廃止

生存期間/ボローチェッカー

  • RFC 0066 一時的な値に対する参照を間接的に取った場合も、直接取った場合と同様にそ の生存期間を延長できるようにする
  • RFC 0107 パターンマッチのガード内でムーブ束縛された変数を使う (未実装)
  • RFC 0130 ボローチェッカーにおける Box<T> の特別扱いの廃止
  • RFC 0141 生存期間の省略規則の整理
  • RFC 0192 トレイトオブジェクト型の生存期間 (RFC 0599, RFC 1156も参照)
  • RFC 0246 staticconst/static に分割
  • RFC 0387 高階トレイト境界 T: for<'a> Trait の導入

コード生成/ABI

  • RFC 0008 extern "rust-intrinsic" の廃止 (破棄)
  • RFC 0079 #[repr(C)] などで明示しない限り、構造体レイアウトは入れ替えられる可能性がある
  • RFC 0320 構造体等からdrop flagフィールドを削除、変数ごとのdrop flagに移行
  • RFC 0379 ランタイムリフレクションと、それを用いた {:?} の削除、 libdebug/Poly の削除 ({:?}RFC 0504により復活)

ライブラリ

  • RFC 0040 libstd の実装を libcore, liballoc, liblibc などのライブラリに分割する。
  • RFC 0042/0007 regex crateの同梱 (現在は同梱されていない)
  • RFC 0050 デバッグモードでのみ有効化される debug_assert!() の導入
  • RFC 0060 StrBufString にリネーム
  • RFC 0093 println!format! から地域化の機能を削除し、構文を整理
  • RFC 0100 PartialOrd::partial_cmp を追加
  • RFC 0123 ShareSync にリネーム
  • RFC 0201 std::error::Error トレイトによるエラーの相互変換
  • RFC 0216 HashMap 等でfindの結果を保持する Entry 型の導入
  • RFC 0221 fail!()panic!() にリネーム
  • RFC 0230 標準ライブラリからグリーンスレッド関係の部分を削除
  • RFC 0235 コレクション関連ライブラリの整理と慣例の確立: Cow を導入、 Deque などの抽象化用トレイトを削除し Iterator を中心にした枠組みを整備、各種関数の命名規則を統一
  • RFC 0256 Gc<T>/@T (Rc<T> とは異なり、循環参照も解放される) の削除
  • RFC 0356 型名にモジュール名を含めない慣習を定義し、 io::IoErrorio::Error にリネーム
  • RFC 0369 std::num にあった様々な抽象的な数値型トレイトの削除 (現在は Signed も含め大部分が削除され num crateに移管済み)
  • RFC 0380 std::fmt の安定化
  • RFC 0439 std::cmpstd::ops の整理: 演算子オーバーロードトレイトの整理、ヘテロジェニアスな Eq, Slice/SliceMutを削除してRange*型を導入、IndexSetの導入 (IndexSet は実装されていない模様; RFC issue #997 も参照)
  • RFC 0458 Send: 'static を削除、 &T: Send ←→ T: Sync
  • RFC 0461 タスクローカル領域のための std::local_data を整理してスレッドローカル領域のための std::tls を導入 (現在は std::thread に統合)
  • RFC 0474 std::path の整理: 正規化の意味論を変更、UTF-8とは限らないパスのために PathBuf/OsPath 型を新たに導入
  • RFC 0486 std::ascii::Ascii 型を削除して ascii 外部crateに分離
  • RFC 0494 std::c_vec を廃止、 std::c_strstd::ffi にリネーム、 CString の所有権の扱いを変更

コンパイラ/リンカ/Cargo