Skip to content

Commit 557d71f

Browse files
authored
Merge pull request #149 from m-shaka/improve-ch15-02-mid
improve translation of mid of ch15-02
2 parents f6ed372 + 384dcfa commit 557d71f

File tree

1 file changed

+27
-34
lines changed

1 file changed

+27
-34
lines changed

src/ch15-02-deref.md

+27-34
Original file line numberDiff line numberDiff line change
@@ -177,17 +177,17 @@ references by default. Then we’ll look at how to add the ability to use the
177177
dereference operator.
178178
-->
179179

180-
標準ライブラリが提供している`Box<T>`型に似たスマートポインタを構築して、スマートポインタは既定で
181-
参照に比べてどう異なって振る舞うのか経験しましょう。それから、参照外し演算子を使う能力を追加する方法に目を向けましょう
180+
標準ライブラリが提供している`Box<T>`型に似たスマートポインタを作りましょう。そうすれば、スマートポインタがそのままだと
181+
参照と同じ様には振る舞わないことがわかります。それから、どうすれば参照外し演算子を使えるようになるのか見てみましょう
182182

183183
<!--
184184
The `Box<T>` type is ultimately defined as a tuple struct with one element, so
185185
Listing 15-8 defines a `MyBox<T>` type in the same way. We’ll also define a
186186
`new` function to match the `new` function defined on `Box<T>`.
187187
-->
188188

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`関数も定義しています。
191191

192192
<!--
193193
<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
218218
type `T` and returns a `MyBox` instance that holds the value passed in.
219219
-->
220220

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`のインスタンスを返します
224224

225225
<!--
226226
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
229229
`MyBox`.
230230
-->
231231

232-
試しにリスト15-7の`main`関数をリスト15-8に追加し、`Box<T>`の代わりに定義した`MyBox<T>`型を使うよう変更してみてください
232+
試しにリスト15-7の`main`関数をリスト15-8に追加し、定義した`MyBox<T>`型を`Box<T>`の代わりに使うよう変更してみてください
233233
コンパイラは`MyBox`を参照外しする方法がわからないので、リスト15-9のコードはコンパイルできません。
234234

235235
<!--
@@ -259,7 +259,7 @@ way we used references and `Box<T>`</span>
259259
Here’s the resulting compilation error:
260260
-->
261261

262-
こちらが結果として出るコンパイルエラーです:
262+
こちらが結果として出るコンパイルエラーです
263263

264264
```text
265265
error[E0614]: type `MyBox<{integer}>` cannot be dereferenced
@@ -276,7 +276,7 @@ ability on our type. To enable dereferencing with the `*` operator, we
276276
implement the `Deref` trait.
277277
-->
278278

279-
`MyBox<T>`に参照外しの能力を実装していないので、参照外しできません`*`演算子で参照外しできるようにするには、
279+
`MyBox<T>`の参照を外すことはできません。そのための実装を与えていないからです`*`演算子で参照外しできるようにするには、
280280
`Deref`トレイトを実装します。
281281

282282
<!--
@@ -293,10 +293,10 @@ borrows `self` and returns a reference to the inner data. Listing 15-10
293293
contains an implementation of `Deref` to add to the definition of `MyBox`:
294294
-->
295295

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`の実装が含まれています
300300

301301
<!--
302302
<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
330330
more detail in Chapter 19.
331331
-->
332332

333-
`type Target = T;`という記法は、`Deref`トレイトが使用する関連型を定義しています。関連型は、
334-
ジェネリック引数を宣言する少しだけ異なる方法ですが、今は気にする必要はありません; 第19章でより詳しく講義します。
333+
`type Target = T;`という記法は、`Deref`トレイトが使用する関連型を定義しています。関連型はまた少し違ったやり方でジェネリック引数を宣言するためのものですが、今は気にする必要はありません。第19章でより詳しく扱います。
335334

336335
<!--
337336
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,
340339
and the assertions pass!
341340
-->
342341

343-
`deref`メソッドの本体を`&self.0`で埋めているので`deref``*`演算子でアクセスしたい値への参照を返します
342+
`deref`メソッドの本体は`&self.0`だけなので`deref`が返すのは私達が`*`演算子でアクセスしたい値への参照なわけです
344343
リスト15-9の`MyBox<T>``*`を呼び出す`main`関数はこれでコンパイルでき、アサートも通ります!
345344

346345
<!--
@@ -350,23 +349,20 @@ that implements `Deref` and call the `deref` method to get a `&` reference that
350349
it knows how to dereference.
351350
-->
352351

353-
`Deref`がなければ、コンパイラは`&`参照しか参照外しできなくなります。`deref`メソッドによりコンパイラは、
354-
`Deref`を実装するあらゆる型の値を取り`deref`メソッドを呼び出して参照外しの仕方を知っている`&`参照を得る能力を獲得するのです
352+
`Deref`トレイトがないと、コンパイラは`&`参照しか参照外しできません。
353+
`deref`メソッドのおかげで、コンパイラは`Deref`を実装している型の値を取り`deref`メソッドを呼ぶことで、参照外しが可能な`&`参照を得られるようになります
355354

356355
<!--
357356
When we entered `*y` in Listing 15-9, behind the scenes Rust actually ran this
358357
code:
359358
-->
360359

361-
リスト15-9に`*y`を入力した時、水面下でコンパイラは、実際にはこのようなコードを走らせていました:
360+
リスト15-9に`*y`を入力した時、水面下でRustは実際にはこのようなコードを走らせていました。
362361

363362
```rust,ignore
364363
*(y.deref())
365364
```
366365

367-
<!--
368-
最後の行は、これで合っているのか自信がない・・・
369-
-->
370366

371367
<!--
372368
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
376372
`Deref`.
377373
-->
378374

379-
コンパイラは、`*`演算子を`deref`メソッド、それから何の変哲もない参照外しの呼び出しに置き換えるので
380-
`deref`メソッドを呼び出す必要があるかどうかを考える必要はないわけです。このRustの機能により、
381-
普通の参照か`Deref`を実装した型であるかどうかに関わらず、等しく機能するコードを書かせてくれます
375+
Rustが`*`演算子を`deref`メソッドの呼び出しと普通の参照外しへと置き換えてくれるので
376+
私達は`deref`メソッドを呼び出す必要があるかどうかを考えなくて済むわけです。このRustの機能により、
377+
普通の参照か`Deref`を実装した型であるかどうかに関わらず、等しく機能するコードを書くことができます
382378

383379
<!--
384380
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
389385
cases where we use the dereference operator.
390386
-->
391387

392-
`deref`メソッドが値への参照を返し、`*(y.deref())`のかっこの外の何の変哲もない参照外しがそれでも必要な理由は
393-
所有権システムです`deref`メソッドが値への参照ではなく、値を直接返したら、値は`self`から外にムーブされてしまいます。
394-
今回の場合や、参照外し演算子を使用する多くの場合には`MyBox<T>`の中の値の所有権を奪いたくはありません。
388+
`deref`メソッドが値への参照を返し、`*(y.deref())`のかっこの外にある普通の参照外しがそれでも必要になるのは
389+
所有権システムがあるからです`deref`メソッドが値への参照ではなく値を直接返したら、値は`self`から外にムーブされてしまいます。
390+
今回もそうですが、参照外し演算子を使用するときはほとんどの場合、`MyBox<T>`の中の値の所有権を奪いたくはありません。
395391

396-
<!--
397-
2行目、... just once, [each time ...]という構造と思われる
398-
-->
399392

400393
<!--
401394
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
405398
Listing 15-9.
406399
-->
407400

408-
`*`演算子は、コードで`*`を打つたびに、ただ1回、`deref`メソッドの呼び出し、そして`*`演算子の呼び出しに置き換えられることに注意してください
409-
`*`演算子の置き換えは、無限に繰り返されないので、`i32`に行き着き、リスト15-9で`assert_eq!``5`と合致します。
401+
`*`演算子が`deref`メソッドの呼び出しと`*`演算子の呼び出しに置き換えられるのは、コード内で`*`を打つ毎にただ1回だけ、という点に注意して下さい
402+
`*`演算子の置き換えは無限に繰り返されないので、`i32`のデータに行き着きます。これはリスト15-9で`assert_eq!``5`と合致します。
410403

411404
<!--
412405
### Implicit Deref Coercions with Functions and Methods

0 commit comments

Comments
 (0)