概要: 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
if
やfor
などのブロックと紛らわしい場面では構造体の{}
を禁止する - 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
Index
をIndex
/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
static
をconst
/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
StrBuf
をString
にリネーム - RFC 0093
println!
やformat!
から地域化の機能を削除し、構文を整理 - RFC 0100
PartialOrd::partial_cmp
を追加 - RFC 0123
Share
をSync
にリネーム - 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::IoError
をio::Error
にリネーム - RFC 0369
std::num
にあった様々な抽象的な数値型トレイトの削除 (現在はSigned
も含め大部分が削除されnum
crateに移管済み) - RFC 0380
std::fmt
の安定化 - RFC 0439
std::cmp
とstd::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_str
をstd::ffi
にリネーム、CString
の所有権の扱いを変更