|
| 1 | +<!-- |
1 | 2 | # New keywords |
| 3 | +--> |
2 | 4 |
|
| 5 | +# 新しいキーワード |
| 6 | + |
| 7 | +<!-- |
3 | 8 |  |
| 9 | +--> |
| 10 | + |
| 11 | + |
4 | 12 |
|
| 13 | +<!-- |
5 | 14 | ## Summary |
| 15 | +--> |
6 | 16 |
|
| 17 | +## 概要 |
| 18 | + |
| 19 | +<!-- |
7 | 20 | - `dyn` is a [strict keyword][strict], in 2015 it is a [weak keyword]. |
8 | 21 | - `async` and `await` are [strict keywords][strict]. |
9 | 22 | - `try` is a [reserved keyword]. |
| 23 | +--> |
| 24 | + |
| 25 | +- `dyn` は[正格キーワード][strict]です。2015 では[弱いキーワード]です。 |
| 26 | +- `asnyc` と `await` は[正格キーワード][strict]です。 |
| 27 | +- `try` は[予約キーワード]です。 |
10 | 28 |
|
| 29 | +<!-- |
11 | 30 | [strict]: https://doc.rust-lang.org/reference/keywords.html#strict-keywords |
12 | 31 | [weak keyword]: https://doc.rust-lang.org/reference/keywords.html#weak-keywords |
13 | 32 | [reserved keyword]: https://doc.rust-lang.org/reference/keywords.html#reserved-keywords |
| 33 | +--> |
| 34 | + |
| 35 | +[strict]: https://doc.rust-lang.org/reference/keywords.html#strict-keywords |
| 36 | +[弱いキーワード]: https://doc.rust-lang.org/reference/keywords.html#weak-keywords |
| 37 | +[予約キーワード]: https://doc.rust-lang.org/reference/keywords.html#reserved-keywords |
14 | 38 |
|
| 39 | +<!-- |
15 | 40 | ## Motivation |
| 41 | +--> |
| 42 | + |
| 43 | +## 動機 |
16 | 44 |
|
| 45 | +<!-- |
17 | 46 | ### `dyn Trait` for trait objects |
| 47 | +--> |
18 | 48 |
|
| 49 | +### トレイトオブジェクトを表す `dyn Trait` |
| 50 | + |
| 51 | +<!-- |
19 | 52 | The `dyn Trait` feature is the new syntax for using trait objects. In short: |
| 53 | +--> |
| 54 | + |
| 55 | +`dyn Trait` 機能は、トレイトオブジェクトを使うための新しい構文です。簡単に言うと: |
20 | 56 |
|
| 57 | +<!-- |
21 | 58 | * `Box<Trait>` becomes `Box<dyn Trait>` |
22 | 59 | * `&Trait` and `&mut Trait` become `&dyn Trait` and `&mut dyn Trait` |
| 60 | +--> |
23 | 61 |
|
| 62 | +* `Box<Trait>` は `Box<dyn Trait>` になり、 |
| 63 | +* `&Trait` と `&mut Trait` は `&dyn Trait` と `&mut dyn Trait` になる |
| 64 | + |
| 65 | +<!-- |
24 | 66 | And so on. In code: |
| 67 | +--> |
| 68 | + |
| 69 | +といった具合です。プログラム内では: |
25 | 70 |
|
26 | 71 | ```rust |
27 | 72 | trait Trait {} |
28 | 73 |
|
29 | 74 | impl Trait for i32 {} |
30 | 75 |
|
31 | 76 | // old |
| 77 | +// いままで |
32 | 78 | fn function1() -> Box<Trait> { |
33 | 79 | # unimplemented!() |
34 | 80 | } |
35 | 81 |
|
36 | 82 | // new |
| 83 | +// これから |
37 | 84 | fn function2() -> Box<dyn Trait> { |
38 | 85 | # unimplemented!() |
39 | 86 | } |
40 | 87 | ``` |
41 | 88 |
|
| 89 | +<!-- |
42 | 90 | That's it! |
| 91 | +--> |
| 92 | + |
| 93 | +これだけです! |
43 | 94 |
|
| 95 | +<!-- |
44 | 96 | #### Why? |
| 97 | +--> |
45 | 98 |
|
| 99 | +#### なぜ? |
| 100 | + |
| 101 | +<!-- |
46 | 102 | Using just the trait name for trait objects turned out to be a bad decision. |
47 | 103 | The current syntax is often ambiguous and confusing, even to veterans, |
48 | 104 | and favors a feature that is not more frequently used than its alternatives, |
49 | 105 | is sometimes slower, and often cannot be used at all when its alternatives can. |
| 106 | +--> |
| 107 | + |
| 108 | +トレイトオブジェクトにトレイト名をそのまま使うのは悪手だったと、後になって分かりました。 |
| 109 | +今までの構文は、経験者にとってさえ往々にして曖昧にして難解で、代替機能を使うべきで本来お呼びでないような場面[^1]で頻繁に使われ、時には遅く、代替機能にはできることができないのです。 |
50 | 110 |
|
| 111 | +<!-- |
51 | 112 | Furthermore, with `impl Trait` arriving, "`impl Trait` vs `dyn Trait`" is much |
52 | 113 | more symmetric, and therefore a bit nicer, than "`impl Trait` vs `Trait`". |
53 | 114 | `impl Trait` is explained [here][impl-trait]. |
| 115 | +--> |
54 | 116 |
|
| 117 | +その上、`impl Trait` が入ったことで、「`impl Trait` か `dyn Trait` か」の関係はより対称的になり、「`impl Trait` か `Trait` か」よりちょっといい感じです。 |
| 118 | +`impl Trait` の説明は[こちら][impl-trait]です。 |
| 119 | + |
| 120 | +<!-- |
55 | 121 | In the new edition, you should therefore prefer `dyn Trait` to just `Trait` |
56 | 122 | where you need a trait object. |
| 123 | +--> |
| 124 | + |
| 125 | +したがって、新しいエディションでは、トレイトオブジェクトが必要なときは、ただの `Trait` でなく `dyn Trait` を使うべきです。 |
57 | 126 |
|
58 | 127 | <!-- |
59 | 128 | [impl-trait]: ../../rust-by-example/trait/impl_trait.html |
60 | 129 | --> |
61 | | -[impl-trait]: https://doc.rust-jp.rs/rust-by-example-ja/rust-by-example/trait/impl_trait.html |
| 130 | +[impl-trait]: https://doc.rust-jp.rs/rust-by-example-ja/trait/impl_trait.html |
| 131 | + |
62 | 132 |
|
| 133 | +> [^1] *訳注*: |
| 134 | +原文ではこの文は、本ページで説明する新構文を提案する [RFC](https://rust-lang.github.io/rfcs/2113-dyn-trait-syntax.html) から抜粋された文章になっています。 |
| 135 | +特に脚注で示した箇所は、原文では "favors a feature that is not more frequently used than its alternatives" とあり、その文意は[同 RFC に解説されています](https://rust-lang.github.io/rfcs/2113-dyn-trait-syntax.html#favors-a-feature-that-is-not-more-frequently-used-than-its-alternatives)。以下では、それを要約します。 |
| 136 | +特定のトレイトを実装した異なる型を共通して扱いたいとき、大抵はトレイトオブジェクトを使う必要はありません。 |
| 137 | +単一のコンテナに複数の型の構造体を入れたい場合、`enum` を使えばよいです。 |
| 138 | +関数の返り値が特定のトレイトを実装していると示すには、`impl Trait` 構文を使えばよいです。 |
| 139 | +特定のトレイトを実装する任意の型を関数の引数や構造体のフィールドにした場合、ジェネリクスを使えばよいです。 |
| 140 | +大抵の場合は、このようにセマンティクス面からもパフォーマンス面からもより適切な代替案があり、トレイトオブジェクトの出る幕はありません。 |
| 141 | +トレイトオブジェクトが真に必要なのは、これより複雑なことをしたい場合だけです。 |
| 142 | +しかし、Rust 2015 では、`&Trait` のように書くだけで、「気軽に」トレイトオブジェクトが作れてしまうという罠がありました。 |
| 143 | +そこで、Rust 2018 では、どうしてもトレイトオブジェクトを作りたい場合は `&dyn Trait` 構文を使用することが必要になりました。 |
| 144 | + |
| 145 | +<!-- |
63 | 146 | ### `async` and `await` |
| 147 | +--> |
| 148 | + |
| 149 | +### `async` と `await` |
64 | 150 |
|
| 151 | +<!-- |
65 | 152 | These keywords are reserved to implement the async-await feature of Rust, which was ultimately [released to stable in 1.39.0](https://blog.rust-lang.org/2019/11/07/Async-await-stable.html). |
| 153 | +--> |
66 | 154 |
|
| 155 | +これらのキーワードは Rust に非同期の機能を実装するために予約されました。非同期の機能は[最終的に 1.39.0 でリリースされました](https://blog.rust-lang.org/2019/11/07/Async-await-stable.html)。 |
| 156 | + |
| 157 | +<!-- |
67 | 158 | ### `try` keyword |
| 159 | +--> |
| 160 | + |
| 161 | +### キーワード `try` |
68 | 162 |
|
| 163 | +<!-- |
69 | 164 | The `try` keyword is reserved for use in `try` blocks, which have not (as of this writing) been stabilized ([tracking issue](https://github.com/rust-lang/rust/issues/31436)) |
| 165 | +--> |
| 166 | + |
| 167 | +キーワード `try` は `try` ブロックで使うために予約されましたが、(これを書いている時点で)まだ安定化されていません([追跡イシュー](https://github.com/rust-lang/rust/issues/31436)) |
0 commit comments