指示先に1を足します。とマークしなければならないことに気付くでしょう。しないと、イミュータブルな値へのミュータブルな借用ということになってしまい、使うことができなくなってしまいます。したことにも気付くでしょう。参照の内容にアクセスするためにもそれらを使う必要があるでしょう。参照は普通の参照と同じです。前の例で何かが怪しいと思ったかもしれません。使って追加のスコープを必要とするからです。それらを削除すれば、次のようなエラーが出ます。{}^結論から言うと、ルールがあります。ルールこれがRustでの借用についてのルールです。最初に、借用は全て所有者のスコープより長く存続してはなりません。次に、次の2種類の借用のどちらか1つを持つことはありますが、両方を同時に持つことはありません。)これがデータ競合の定義と非常に似ていることに気付くかもしれません。同じではありませんが。「データ競合」は2つ以上のポインタがメモリの同じ場所に同時にアクセスするとき、少なくともそれらの1つが書込みを行っていて、作業が同期されていないところで「データ競合」は起きます。書込みを行わないのであれば、参照は好きな数だけ使うことができます。同時に1つしか持つことができないので、データ競合は起き得ません。これがRustがデータ競合をコンパイル時に回避する方法です。ルールを破れば、そのときはエラーが出るでしょう。これを念頭に置いて、もう一度例を考えましょう。スコープの考え方このコードについて考えていきます。x);このコードは次のようなエラーを出します。^なぜなら、これはルールに違反しているからです。作ることは許されないのです。部分はこの問題についての考え方のヒントを示します。{}^言い換えると、ミュータブルな借用は、先ほどの例の残りの間、ずっと保持されるということです。イミュータブルな借用を提供できるわけです。Rustでは借用はその有効なスコープと結び付けられます。スコープはこのように見えます。xの&mut借用がここで終わるスコープは衝突します。作ることができません。波括弧を追加するときはこうなります。ここでxを借用しようとするこれなら問題ありません。ミュータブルな借用はイミュータブルな借用を作る前にスコープから外れます。スコープは、借用がどれくらい存続するのか理解するための鍵となります。借用が回避する問題なぜこのような厳格なルールがあるのでしょうか。前述したように、それらのルールはデータ競合を回避します。データ競合はどのような種類の問題を起こすのでしょうか。ここに一部を示します。一例は「イテレータの無効」です。それは繰返しを行っているコレクションを変更しようとするときに起こります。Rustの借用チェッカはこれの発生を回避します。i);}これは1から3までを表示します。ベクタに対して繰り返すとき、要素への参照だけを受け取ります。それ自体イミュータブルとして借用され、それは繰返しを行っている間はそれを変更できないことを意味します。v.push(34);}これがエラーです。ループによって借用されるので、それを変更することはできません。参照はそれらの指示するリソースよりも長く生存することはできません。Rustはこれが真であることを保証するために、参照のスコープをチェックするでしょう。Rustがこの性質をチェックしなければ、無効な参照をうっかり使ってしまうかもしれません。y);次のようなエラーが出ます。存在するスコープの中でだけ有効だということです。なくなるとすぐに、それを指示することは不正になります。そのように、エラーは借用が「十分長く生存していない」ことを示します。それが正しい期間有効ではないからです。宣言されたとき、同じ問題が起こります。これは同じスコープにあるリソースはそれらの宣言された順番と逆に解放されるからです。y);次のようなエラーが出ます。前に宣言されています。長く生存することを意味し、それは許されません。