@@ -200,9 +200,9 @@ <h2><a class="header" href="#ライフタイムで参照を検証する" id="ラ
200
200
detailed information.
201
201
-->
202
202
< p > ライフタイムの概念は、他のプログラミング言語の道具とはどこか異なり、間違いなく、
203
- Rustで一番際立った機能になっています。この章では、ライフタイムの全てを講義しないものの 、
204
- ライフタイム記法と遭遇する可能性のある一般的な手段を議論するので、その概念に馴染めます 。
205
- もっと詳しく知るには、第19章の「高度なライフタイム」節を参照されたし 。</ p >
203
+ Rustで一番際立った機能になっています。この章では、ライフタイムの全体を解説することはしませんが 、
204
+ ライフタイム記法が必要となる最も一般的な場合について議論しますので、ライフタイムの概念について馴染むことができるでしょう 。
205
+ もっと詳しく知るには、第19章の「高度なライフタイム」節を参照してください 。</ p >
206
206
<!--
207
207
### Preventing Dangling References with Lifetimes
208
208
-->
@@ -492,9 +492,9 @@ <h3><a class="header" href="#ライフタイム注釈記法" id="ライフタイ
492
492
the lifetimes of multiple references to each other without affecting the
493
493
lifetimes.
494
494
-->
495
- < p > ライフタイム注釈は、いかなる参照の生存期間も変えることはありません。シグニチャがジェネリックな型引数を指定していると、
496
- 関数があらゆる型を受け入れるのと全く同様に、ジェネリックなライフタイム引数を指定することで関数は 、
497
- あらゆるライフタイムの参照を受け入れるのです 。ライフタイム注釈は、ライフタイムに影響することなく、
495
+ < p > ライフタイム注釈は、いかなる参照の生存期間も変えることはありません。シグニチャにジェネリックな型引数を指定された
496
+ 関数が、あらゆる型を受け取ることができるのと同様に、ジェネリックなライフタイム引数を指定された関数は 、
497
+ あらゆるライフタイムの参照を受け取ることができます 。ライフタイム注釈は、ライフタイムに影響することなく、
498
498
複数の参照のライフタイムのお互いの関係を記述します。</ p >
499
499
<!--
500
500
Lifetime annotations have a slightly unusual syntax: the names of lifetime
@@ -534,7 +534,7 @@ <h3><a class="header" href="#ライフタイム注釈記法" id="ライフタイ
534
534
お互いにどう関係するかをコンパイラに指示することを意図しているからです。例えば、
535
535
ライフタイム< code > 'a</ code > 付きの< code > i32</ code > への参照となる引数< code > first</ code > のある関数があるとしましょう。
536
536
この関数にはさらに、< code > 'a</ code > のライフタイム付きの< code > i32</ code > への別の参照となる< code > second</ code > という別の引数もあります。
537
- ライフタイム注釈は、< code > first</ code > と< code > second</ code > の参照がどちらもジェネリックなライフタイムと同じだけ生きることを示唆します 。</ p >
537
+ ライフタイム注釈は、< code > first</ code > と< code > second</ code > の参照がどちらもこのジェネリックなライフタイムと同じだけ生きることを示唆します 。</ p >
538
538
<!--
539
539
### Lifetime Annotations in Function Signatures
540
540
-->
@@ -548,10 +548,10 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
548
548
We’ll name the lifetime `'a` and then add it to each reference, as shown in
549
549
Listing 10-22.
550
550
-->
551
- < p > さて、< code > longest</ code > 関数の文脈でライフタイム注釈を調査しましょう 。ジェネリックな型引数同様、
552
- 関数名と引数リストの間、山カッコの中にジェネリックなライフタイム引数を宣言する必要があります 。
553
- このシグニチャで表現したい制約は、引数の全参照と戻り値が同じライフタイムになることです 。
554
- ライフタイムを< code > 'a</ code > と名付け、それから各参照に追記します。リスト10-22に示したように 。</ p >
551
+ < p > さて、< code > longest</ code > 関数を例にライフタイム注釈を詳しく見ていきましょう 。ジェネリックな型引数同様、
552
+ 関数名と引数リストの間の山カッコの中にジェネリックなライフタイム引数を宣言します 。
553
+ このシグニチャで表現したい制約は、引数の全ての参照と戻り値が同じライフタイムを持つことです 。
554
+ リスト10-22に示すように、 ライフタイムを< code > 'a</ code > と名付け、それを各参照に付与します 。</ p >
555
555
<!--
556
556
<span class="filename">Filename: src/main.rs</span>
557
557
-->
@@ -573,7 +573,7 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
573
573
specifying that all the references in the signature must have the same lifetime
574
574
`'a`</span>
575
575
-->
576
- < p > < span class ="caption "> リスト10-22: シグニチャの全参照が同じライフタイム< code > 'a</ code > になると指定した < code > longest</ code > 関数の定義</ span > </ p >
576
+ < p > < span class ="caption "> リスト10-22: シグニチャの全参照が同じライフタイム< code > 'a</ code > を持つと指定した < code > longest</ code > 関数の定義</ span > </ p >
577
577
<!--
578
578
This code should compile and produce the result we want when we use it with the
579
579
`main` function in Listing 10-20.
@@ -595,11 +595,11 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
595
595
< p > これで関数シグニチャは、何らかのライフタイム< code > 'a</ code > に対して、関数は2つの引数を取り、
596
596
どちらも少なくともライフタイム< code > 'a</ code > と同じだけ生きる文字列スライスであるとコンパイラに教えるようになりました。
597
597
また、この関数シグニチャは、関数から返る文字列スライスも少なくともライフタイム< code > 'a</ code > と同じだけ生きると、
598
- コンパイラに教えています。これらの制約は、コンパイラに強制してほしいものです 。
598
+ コンパイラに教えています。これらの制約は、まさに私たちがコンパイラに保証してほしかったものです 。
599
599
この関数シグニチャでライフタイム引数を指定する時、渡されたり、返したりした、いかなる値のライフタイムも変更していないことを思い出してください。
600
600
むしろ、借用チェッカーは、これらの制約を守らない値全てを拒否するべきと指定しています。
601
- < code > longest</ code > 関数は、正確に < code > x</ code > と< code > y</ code > の生存期間を知る必要はなく、何かのスコープが < code > 'a </ code > に代替され 、
602
- このシグニチャを満足することだけ知っている必要があることに注意してください 。</ p >
601
+ < code > longest</ code > 関数は、< code > x</ code > と< code > y</ code > の正確な生存期間を知っている必要はなく 、
602
+ このシグニチャを満たすようなスコープを < code > 'a </ code > に代入できることを知っているだけであることに注意してください 。</ p >
603
603
<!--
604
604
When annotating lifetimes in functions, the annotations go in the function
605
605
signature, not in the function body. Rust can analyze the code within the
@@ -609,10 +609,10 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
609
609
might be different each time the function is called. This is why we need to
610
610
annotate the lifetimes manually.
611
611
-->
612
- < p > 関数でライフタイムを注釈する際、注釈は関数シグニチャに < ruby > 嵌 < rp > ( </ rp > < rt > はま </ rt > < rp > ) </ rp > </ ruby > り、
613
- 関数本体には嵌りません。コンパイラは、なんの助けもなく、関数内のコードを解析できます 。しかしながら、
614
- 関数に、関数外からの参照や、関数外への参照がある場合、コンパイラは引数や戻り値のライフタイムをそれだけで解決することはほとんど不可能になります 。
615
- ライフタイムは 、関数が呼び出される度に異なる可能性があります。このために、手動でライフタイムを注釈する必要があるのです。</ p >
612
+ < p > 関数にライフタイムを注釈するときは、注釈は関数の本体ではなくシグニチャに付与します。
613
+ コンパイラは注釈がなくとも関数内のコードを解析できます 。しかしながら、
614
+ 関数に関数外からの参照や関数外への参照がある場合、コンパイラが引数や戻り値のライフタイムを自力で解決することはほとんど不可能になります 。
615
+ そのライフタイムは 、関数が呼び出される度に異なる可能性があります。このために、手動でライフタイムを注釈する必要があるのです。</ p >
616
616
<!--
617
617
When we pass concrete references to `longest`, the concrete lifetime that is
618
618
substituted for `'a` is the part of the scope of `x` that overlaps with the
@@ -622,15 +622,15 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
622
622
the returned reference will also be valid for the length of the smaller of the
623
623
lifetimes of `x` and `y`.
624
624
-->
625
- < p > 具体的な参照を< code > longest</ code > に渡すと、< code > 'a</ code > を代替する具体的なライフタイムは 、< code > y </ code > のスコープと被さる < code > x </ code > のスコープの一部になります 。
625
+ < p > 具体的な参照を< code > longest</ code > に渡すと、< code > 'a</ code > に代入される具体的なライフタイムは 、< code > x </ code > のスコープの一部であって < code > y </ code > のスコープと重なる部分となります 。
626
626
言い換えると、ジェネリックなライフタイム< code > 'a</ code > は、< code > x</ code > と< code > y</ code > のライフタイムのうち、小さい方に等しい具体的なライフタイムになるのです。
627
627
返却される参照を同じライフタイム引数< code > 'a</ code > で注釈したので、返却される参照も< code > x</ code > か< code > y</ code > のライフタイムの小さい方と同じだけ有効になるでしょう。</ p >
628
628
<!--
629
629
Let’s look at how the lifetime annotations restrict the `longest` function by
630
630
passing in references that have different concrete lifetimes. Listing 10-23 is
631
631
a straightforward example.
632
632
-->
633
- < p > ライフタイム注釈が異なる具体的なライフタイムになる参照を渡すことで < code > longest</ code > 関数を制限する方法を見ましょう。
633
+ < p > ライフタイム注釈が異なる具体的なライフタイムを持つ参照を渡すことで < code > longest</ code > 関数を制限する方法を見ましょう。
634
634
リスト10-23は、率直な例です。</ p >
635
635
<!--
636
636
<span class="filename">Filename: src/main.rs</span>
@@ -659,7 +659,7 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
659
659
<span class="caption">Listing 10-23: Using the `longest` function with
660
660
references to `String` values that have different concrete lifetimes</span>
661
661
-->
662
- < p > < span class ="caption "> リスト10-23: 異なる具体的なライフタイムの < code > String</ code > 値への参照で< code > longest</ code > 関数を使用する</ span > </ p >
662
+ < p > < span class ="caption "> リスト10-23: 異なる具体的なライフタイムを持つ < code > String</ code > 値への参照で< code > longest</ code > 関数を使用する</ span > </ p >
663
663
<!--
664
664
In this example, `string1` is valid until the end of the outer scope, `string2`
665
665
is valid until the end of the inner scope, and `result` references something
@@ -724,7 +724,7 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
724
724
this because we annotated the lifetimes of the function parameters and return
725
725
values using the same lifetime parameter `'a`.
726
726
-->
727
- < p > このエラーは、< code > result</ code > が< code > println!</ code > 文に対して有効になるために 、< code > string2</ code > が外側のスコープの終わりまで有効である必要があることを示しています。
727
+ < p > このエラーは、< code > result</ code > が< code > println!</ code > 文に対して有効であるためには 、< code > string2</ code > が外側のスコープの終わりまで有効である必要があることを示しています。
728
728
関数引数と戻り値のライフタイムを同じライフタイム引数< code > 'a</ code > で注釈したので、コンパイラはこのことを知っています。</ p >
729
729
<!--
730
730
As humans, we can look at this code and see that `string1` is longer than
@@ -736,11 +736,11 @@ <h3><a class="header" href="#関数シグニチャにおけるライフタイム
736
736
the lifetimes of the references passed in. Therefore, the borrow checker
737
737
disallows the code in Listing 10-24 as possibly having an invalid reference.
738
738
-->
739
- < p > 人間からしたら、このコードを見て < code > string1</ code > は< code > string2</ code > よりも長いことが確認でき、
740
- 故に < code > result </ code > は < code > string1 </ code > への参照を含んでいます 。まだ< code > string1</ code > はスコープを抜けていないので、
741
- それでも < code > string1</ code > への参照は< code > println!</ code > にとって有効でしょう。ですが、コンパイラはこの場合、
739
+ < p > 人間からしたら、< code > string1</ code > は< code > string2</ code > よりも長く、それ故に < code > result </ code > が < code > string1 </ code > への参照を含んでいることは
740
+ コードから明らかです 。まだ< code > string1</ code > はスコープを抜けていないので、
741
+ < code > string1</ code > への参照は< code > println!</ code > にとって有効でしょう。ですが、コンパイラはこの場合、
742
742
参照が有効であると見なせません。< code > longest</ code > 関数から返ってくる参照のライフタイムは、
743
- 渡した参照のうちの小さい方と同じだとコンパイラに指示しました。それ故に 、
743
+ 渡した参照のうちの小さい方と同じだとコンパイラに指示しました。したがって 、
744
744
借用チェッカーは、リスト10-24のコードを無効な参照がある可能性があるとして許可しないのです。</ p >
745
745
<!--
746
746
Try designing more experiments that vary the values and lifetimes of the
@@ -761,7 +761,7 @@ <h3><a class="header" href="#ライフタイムの観点で思考する" id="ラ
761
761
string slice, we wouldn’t need to specify a lifetime on the `y` parameter. The
762
762
following code will compile:
763
763
-->
764
- < p > ライフタイム引数を指定する必要のある手段は、関数が行っていることによります 。例えば、
764
+ < p > 何にライフタイム引数を指定する必要があるかは、関数が行っていることに依存します 。例えば、
765
765
< code > longest</ code > 関数の実装を最長の文字列スライスではなく、常に最初の引数を返すように変更したら、
766
766
< code > y</ code > 引数に対してライフタイムを指定する必要はなくなるでしょう。以下のコードはコンパイルできます:</ p >
767
767
<!--
@@ -852,9 +852,10 @@ <h3><a class="header" href="#ライフタイムの観点で思考する" id="ラ
852
852
enough information to allow memory-safe operations and disallow operations that
853
853
would create dangling pointers or otherwise violate memory safety.
854
854
-->
855
- < p > 究極的にライフタイム記法は、関数のいろんな引数と戻り値のライフタイムを接続することに関するのです。
856
- 一旦、繋がりができたら、メモリ安全な処理を許可するのに十分な情報がコンパイラにはあり、
857
- ダングリングポインタを生成するであろう処理を不認可し、さもなくばメモリ安全性を侵害するのです。</ p >
855
+ < p > 究極的にライフタイム記法は、関数のいろんな引数と戻り値のライフタイムを接続することに関するものです。
856
+ 一旦それらが繋がれば、メモリ安全な処理を許可し、
857
+ ダングリングポインタを生成したりメモリ安全性を侵害したりする処理を禁止するのに
858
+ 十分な情報をコンパイラは得たことになります。</ p >
858
859
<!--
859
860
### Lifetime Annotations in Struct Definitions
860
861
-->
0 commit comments