From 183a6ff42364133911f989db840627827bd6f692 Mon Sep 17 00:00:00 2001 From: TonalidadeHidrica <47710717+TonalidadeHidrica@users.noreply.github.com> Date: Thu, 30 Jan 2025 23:04:51 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[2021]=20=E3=80=8C=E7=94=9F=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=95=E3=82=BF=E3=82=A4=E3=83=A0=E3=80=8D=E3=82=92?= =?UTF-8?q?=E7=BF=BB=E8=A8=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SUMMARY.md | 2 +- src/rust-2021/raw-lifetimes.md | 104 +++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/rust-2021/raw-lifetimes.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ab10822..dd10f78 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 new file mode 100644 index 0000000..7fc2435 --- /dev/null +++ b/src/rust-2021/raw-lifetimes.md @@ -0,0 +1,104 @@ + +# 生ライフタイム + + + +## 概要 + + + +- `'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 { + ($a:tt $b:tt $c:tt) => {}; +} +``` + + + +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 From 67a2527de151ac0e5b25e451f66942556c7268e7 Mon Sep 17 00:00:00 2001 From: TonalidadeHidrica <47710717+TonalidadeHidrica@users.noreply.github.com> Date: Sat, 22 Feb 2025 19:48:40 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E4=B8=80=E9=83=A8=E3=81=AE=E5=8E=9F?= =?UTF-8?q?=E6=96=87=E3=82=92=E8=AA=A4=E3=81=A3=E3=81=A6=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=9F=E3=82=81=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rust-2021/raw-lifetimes.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/rust-2021/raw-lifetimes.md b/src/rust-2021/raw-lifetimes.md index 7fc2435..e536e0d 100644 --- a/src/rust-2021/raw-lifetimes.md +++ b/src/rust-2021/raw-lifetimes.md @@ -94,6 +94,10 @@ Rust 2015 と 2018 では、空白を入れずにトークンをつなげてマ my_macro!('r#foo); ``` + + 2021 エディションでは、これは一つのトークンとして解釈されます。 このマクロを呼び出すためには、以下のように識別子の前に空白を入れてください。 @@ -101,4 +105,8 @@ my_macro!('r#foo); 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