diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 6d03c91..0e1ac15 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -70,7 +70,7 @@ - [クロージャはフィールドごとにキャプチャする](rust-2021/disjoint-capture-in-closures.md) - [panic マクロの一貫性](rust-2021/panic-macro-consistency.md) - [構文の予約](rust-2021/reserving-syntax.md) - - [Raw lifetimes](rust-2021/raw-lifetimes.md) + - [生ライフタイム](rust-2021/raw-lifetimes.md) - [警告からエラーへの格上げ](rust-2021/warnings-promoted-to-error.md) - [マクロ規則における OR パターン](rust-2021/or-patterns-macro-rules.md) - [C-string literals](rust-2021/c-string-literals.md) diff --git a/src/rust-2021/raw-lifetimes.md b/src/rust-2021/raw-lifetimes.md index 657950d..e536e0d 100644 --- a/src/rust-2021/raw-lifetimes.md +++ b/src/rust-2021/raw-lifetimes.md @@ -1,32 +1,82 @@ -> **Rust Edition Guide は現在 Rust 2024 のアップデート作業に向けて翻訳作業中です。本ページはある時点での英語版をコピーしていますが、一部のリンクが動作しない場合や、最新情報が更新されていない場合があります。問題が発生した場合は、[原文(英語版)](https://doc.rust-lang.org/nightly/edition-guide/introduction.html)をご参照ください。** - + +# 生ライフタイム + + +## 概要 + +- `'r#ident_or_keyword` がライフタイムを表す構文として認められ、`'r#fn` のようにキーワードが使用できるようになりました。 + + + +## 詳細 + +生ライフタイムは、新エディションでキーワードが追加された場合の移行を考慮し、Rust 2021 で導入されました。 +[生識別子]は識別子に対する機能でしたが、それと同等です。 +たとえば、2024 エディションでは `gen` キーワードが導入されました。 +しかし、ライフタイム名にキーワードは使えないことから、これではライフタイム `'gen` が使われたコードがコンパイルできなくなってしまいます。 +生ライフタイムにはキーワードも使えるので、移行リントは `'gen` を `'r#gen` に書き換えることができます。 + + + +2021 以前では、生ライフタイムは独立したトークンとみなされます。 +たとえば、`'r#foo` は `'r`, `#`, `foo` の3トークンとして読み込まれます。 + +[生識別子]: https://doc.rust-lang.org/reference/identifiers.html#raw-identifiers + + + +## 移行 + +Rust 2018 のコードベースから Rust 2021 への自動移行の支援のため、2021 エディションには、移行用のリント[`rust_2021_prefixes_incompatible_syntax`] が追加されています。 + + + +コードを Rust 2021 エディション互換に移行するには、次のように実行します。 ```sh cargo fix --edition ``` + +手動でコードを移行する場合も、移行は比較的単純です。 + + + +たとえば、以下のようなマクロがあるとします。 ```rust macro_rules! my_macro { @@ -34,16 +84,29 @@ macro_rules! my_macro { } ``` + + +Rust 2015 と 2018 では、空白を入れずにトークンをつなげてマクロを呼び出しても合法です。 ```rust,ignore my_macro!('r#foo); ``` + + +2021 エディションでは、これは一つのトークンとして解釈されます。 +このマクロを呼び出すためには、以下のように識別子の前に空白を入れてください。 ```rust,ignore my_macro!('r# foo); ``` + + +[`rust_2021_prefixes_incompatible_syntax`]: https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#rust-2021-prefixes-incompatible-syntax