@@ -177,17 +177,17 @@ references by default. Then we’ll look at how to add the ability to use the
177
177
dereference operator.
178
178
-->
179
179
180
- 標準ライブラリが提供している` Box<T> ` 型に似たスマートポインタを構築して、スマートポインタは既定で
181
- 参照に比べてどう異なって振る舞うのか経験しましょう 。それから、参照外し演算子を使う能力を追加する方法に目を向けましょう 。
180
+ 標準ライブラリが提供している` Box<T> ` 型に似たスマートポインタを作りましょう。そうすれば、スマートポインタがそのままだと
181
+ 参照と同じ様には振る舞わないことがわかります 。それから、どうすれば参照外し演算子を使えるようになるのか見てみましょう 。
182
182
183
183
<!--
184
184
The `Box<T>` type is ultimately defined as a tuple struct with one element, so
185
185
Listing 15-8 defines a `MyBox<T>` type in the same way. We’ll also define a
186
186
`new` function to match the `new` function defined on `Box<T>`.
187
187
-->
188
188
189
- ` Box<T> ` 型は究極的に1要素のタプル構造体として定義されているので、リスト15-8は、同じように ` MyBox<T> ` 型を定義しています。
190
- また、` Box<T> ` に定義された` new ` 関数と合致する ` new ` 関数も定義しています。
189
+ ` Box<T> ` 型は突き詰めると(訳註:データがヒープに置かれることを無視すると)1要素のタプル構造体のような定義になります。なのでリスト15-8ではそのように ` MyBox<T> ` 型を定義しています。
190
+ また、` Box<T> ` に定義された` new ` 関数に対応する ` new ` 関数も定義しています。
191
191
192
192
<!--
193
193
<span class="filename">Filename: src/main.rs</span>
@@ -218,9 +218,9 @@ with one element of type `T`. The `MyBox::new` function takes one parameter of
218
218
type `T` and returns a `MyBox` instance that holds the value passed in.
219
219
-->
220
220
221
- ` MyBox ` という構造体を定義し、ジェネリック引数の` T ` を宣言しています。自分の型にどんな型の値も保持させたいからです 。
222
- ` MyBox ` 型は、型 ` T ` を1要素持つタプル構造体です 。` MyBox::new ` 関数は型` T ` の引数を1つ取り、
223
- 渡した値を保持する ` MyBox ` インスタンスを返します 。
221
+ ` MyBox ` という構造体を定義し、ジェネリック引数の` T ` を宣言しています。この型にどんな型の値も持たせたいからです 。
222
+ ` MyBox ` 型は型 ` T ` の要素を1つ持つタプル構造体です 。` MyBox::new ` 関数は型` T ` の引数を1つ取り、
223
+ 渡した値を持つ ` MyBox ` のインスタンスを返します 。
224
224
225
225
<!--
226
226
Let’s try adding the `main` function in Listing 15-7 to Listing 15-8 and
@@ -229,7 +229,7 @@ code in Listing 15-9 won’t compile because Rust doesn’t know how to derefere
229
229
`MyBox`.
230
230
-->
231
231
232
- 試しにリスト15-7の` main ` 関数をリスト15-8に追加し、` Box <T>` の代わりに定義した ` MyBox <T>` 型を使うよう変更してみてください 。
232
+ 試しにリスト15-7の` main ` 関数をリスト15-8に追加し、定義した ` MyBox <T>` 型を ` Box <T>` の代わりに使うよう変更してみてください 。
233
233
コンパイラは` MyBox ` を参照外しする方法がわからないので、リスト15-9のコードはコンパイルできません。
234
234
235
235
<!--
@@ -259,7 +259,7 @@ way we used references and `Box<T>`</span>
259
259
Here’s the resulting compilation error:
260
260
-->
261
261
262
- こちらが結果として出るコンパイルエラーです:
262
+ こちらが結果として出るコンパイルエラーです。
263
263
264
264
``` text
265
265
error[E0614]: type `MyBox<{integer}>` cannot be dereferenced
@@ -276,7 +276,7 @@ ability on our type. To enable dereferencing with the `*` operator, we
276
276
implement the `Deref` trait.
277
277
-->
278
278
279
- ` MyBox<T> ` に参照外しの能力を実装していないので、参照外しできません 。` * ` 演算子で参照外しできるようにするには、
279
+ ` MyBox<T> ` の参照を外すことはできません。そのための実装を与えていないからです 。` * ` 演算子で参照外しできるようにするには、
280
280
` Deref ` トレイトを実装します。
281
281
282
282
<!--
@@ -293,10 +293,10 @@ borrows `self` and returns a reference to the inner data. Listing 15-10
293
293
contains an implementation of `Deref` to add to the definition of `MyBox`:
294
294
-->
295
295
296
- 第10章で議論したように、トレイトを実装するには、トレイトの必須メソッドに実装を提供する必要があります 。
297
- ` Deref ` トレイトは標準ライブラリで提供されていますが、 ` self ` を借用し、
298
- 内部のデータへの参照を返す ` deref ` という1つのメソッドを実装する必要があります。リスト15-10には、
299
- ` MyBox ` の定義に追記する ` Deref ` の実装が含まれています:
296
+ 第10章で議論したように、トレイトを実装するにはトレイトの必須メソッドに実装を与える必要があります 。
297
+ ` Deref ` トレイトは標準ライブラリで提供されており、 ` deref ` という1つのメソッドの実装を要求します。 ` deref ` は ` self ` を借用し、
298
+ 内部のデータへの参照を返すメソッドです。
299
+ リスト15-10には、 ` MyBox ` の定義に付け足す ` Deref ` の実装が含まれています。
300
300
301
301
<!--
302
302
<span class="filename">Filename: src/main.rs</span>
@@ -330,8 +330,7 @@ parameter, but you don’t need to worry about them for now; we’ll cover them
330
330
more detail in Chapter 19.
331
331
-->
332
332
333
- ` type Target = T; ` という記法は、` Deref ` トレイトが使用する関連型を定義しています。関連型は、
334
- ジェネリック引数を宣言する少しだけ異なる方法ですが、今は気にする必要はありません; 第19章でより詳しく講義します。
333
+ ` type Target = T; ` という記法は、` Deref ` トレイトが使用する関連型を定義しています。関連型はまた少し違ったやり方でジェネリック引数を宣言するためのものですが、今は気にする必要はありません。第19章でより詳しく扱います。
335
334
336
335
<!--
337
336
We fill in the body of the `deref` method with `&self.0` so `deref` returns a
@@ -340,7 +339,7 @@ function in Listing 15-9 that calls `*` on the `MyBox<T>` value now compiles,
340
339
and the assertions pass!
341
340
-->
342
341
343
- ` deref ` メソッドの本体を ` &self.0 ` で埋めているので 、` deref ` は ` * ` 演算子でアクセスしたい値への参照を返します 。
342
+ ` deref ` メソッドの本体は ` &self.0 ` だけなので 、` deref ` が返すのは私達が ` * ` 演算子でアクセスしたい値への参照なわけです 。
344
343
リスト15-9の` MyBox<T> ` に` * ` を呼び出す` main ` 関数はこれでコンパイルでき、アサートも通ります!
345
344
346
345
<!--
@@ -350,23 +349,20 @@ that implements `Deref` and call the `deref` method to get a `&` reference that
350
349
it knows how to dereference.
351
350
-->
352
351
353
- ` Deref ` がなければ 、コンパイラは` & ` 参照しか参照外しできなくなります。 ` deref ` メソッドによりコンパイラは、
354
- ` Deref ` を実装するあらゆる型の値を取り 、` deref ` メソッドを呼び出して参照外しの仕方を知っている ` & ` 参照を得る能力を獲得するのです 。
352
+ ` Deref ` トレイトがないと 、コンパイラは` & ` 参照しか参照外しできません。
353
+ ` deref ` メソッドのおかげで、コンパイラは ` Deref ` を実装している型の値を取り 、` deref ` メソッドを呼ぶことで、参照外しが可能な ` & ` 参照を得られるようになります 。
355
354
356
355
<!--
357
356
When we entered `*y` in Listing 15-9, behind the scenes Rust actually ran this
358
357
code:
359
358
-->
360
359
361
- リスト15-9に` *y ` を入力した時、水面下でコンパイラは、実際にはこのようなコードを走らせていました:
360
+ リスト15-9に` *y ` を入力した時、水面下でRustは実際にはこのようなコードを走らせていました。
362
361
363
362
``` rust,ignore
364
363
*(y.deref())
365
364
```
366
365
367
- <!--
368
- 最後の行は、これで合っているのか自信がない・・・
369
- -->
370
366
371
367
<!--
372
368
Rust substitutes the `*` operator with a call to the `deref` method and then a
@@ -376,9 +372,9 @@ identically whether we have a regular reference or a type that implements
376
372
`Deref`.
377
373
-->
378
374
379
- コンパイラは、 ` * ` 演算子を` deref ` メソッド、それから何の変哲もない参照外しの呼び出しに置き換えるので 、
380
- ` deref ` メソッドを呼び出す必要があるかどうかを考える必要はないわけです 。このRustの機能により、
381
- 普通の参照か` Deref ` を実装した型であるかどうかに関わらず、等しく機能するコードを書かせてくれます 。
375
+ Rustが ` * ` 演算子を` deref ` メソッドの呼び出しと普通の参照外しへと置き換えてくれるので 、
376
+ 私達は ` deref ` メソッドを呼び出す必要があるかどうかを考えなくて済むわけです 。このRustの機能により、
377
+ 普通の参照か` Deref ` を実装した型であるかどうかに関わらず、等しく機能するコードを書くことができます 。
382
378
383
379
<!--
384
380
The reason the `deref` method returns a reference to a value and that the plain
@@ -389,13 +385,10 @@ to take ownership of the inner value inside `MyBox<T>` in this case or in most
389
385
cases where we use the dereference operator.
390
386
-->
391
387
392
- ` deref ` メソッドが値への参照を返し、` *(y.deref()) ` のかっこの外の何の変哲もない参照外しがそれでも必要な理由は 、
393
- 所有権システムです 。` deref ` メソッドが値への参照ではなく、値を直接返したら 、値は` self ` から外にムーブされてしまいます。
394
- 今回の場合や、参照外し演算子を使用する多くの場合には ` MyBox<T> ` の中の値の所有権を奪いたくはありません。
388
+ ` deref ` メソッドが値への参照を返し、` *(y.deref()) ` のかっこの外にある普通の参照外しがそれでも必要になるのは 、
389
+ 所有権システムがあるからです 。` deref ` メソッドが値への参照ではなく値を直接返したら 、値は` self ` から外にムーブされてしまいます。
390
+ 今回もそうですが、参照外し演算子を使用するときはほとんどの場合、 ` MyBox<T> ` の中の値の所有権を奪いたくはありません。
395
391
396
- <!--
397
- 2行目、... just once, [each time ...]という構造と思われる
398
- -->
399
392
400
393
<!--
401
394
Note that the `*` operator is replaced with a call to the `deref` method and
@@ -405,8 +398,8 @@ end up with data of type `i32`, which matches the `5` in `assert_eq!` in
405
398
Listing 15-9.
406
399
-->
407
400
408
- ` * ` 演算子は、コードで ` * ` を打つたびに、ただ1回、 ` deref ` メソッドの呼び出し、そして ` * ` 演算子の呼び出しに置き換えられることに注意してください 。
409
- ` * ` 演算子の置き換えは、無限に繰り返されないので、 型` i32 ` に行き着き、リスト15 -9で` assert_eq! ` の` 5 ` と合致します。
401
+ ` * ` 演算子が ` deref ` メソッドの呼び出しと ` * ` 演算子の呼び出しに置き換えられるのは、コード内で ` * ` を打つ毎にただ1回だけ、という点に注意して下さい 。
402
+ ` * ` 演算子の置き換えは無限に繰り返されないので、 型` i32 ` のデータに行き着きます。これはリスト15 -9で` assert_eq! ` の` 5 ` と合致します。
410
403
411
404
<!--
412
405
### Implicit Deref Coercions with Functions and Methods
0 commit comments