以下は、Rustプログラミング言語での移動、コピー、および借用のグラフィカルな説明です 。 基本的に、これらの概念は多くの初心者にとって共通の障害であるRustにのみ固有のものです。
混乱を避けるために、テキストを最小限に抑えようとしました。 このメモは、さまざまなトレーニングマニュアルに代わるものではなく、情報が視覚的に簡単に認識されると考えている人のためにのみ作成されています。 Rustの研究を始めて、これらのグラフが有用であることがわかった場合は、概念をより統合するために、同様のスキームでコードをマークすることをお勧めします。
写真はクリック可能で、拡大できます。 PNG 、 SVG、またはPDFの形式で、翻訳なしのスキームを取得することもできます。
上の2つのスキームは、利用可能なデータセマンティクスの 2つの主要なタイプ(移動またはコピー)を表しています。
- 置換セマンティクス (⤳)のセマンティクスは非常に単純に見えます。 ここに欺きはありません。ほとんどの言語では、プログラマが望む回数だけ変数を使用できるため、動作のセマンティクスは奇妙に思えます。 現実の世界では、これは通常そうではありません。誰かに私のペンを渡して、それを記録に使用することはできません! Rustでは、タイプが
Copy
タイプを実装しない変数には、動作のセマンティクスがあり、その動作を図に示します。 - コピーセマンティクス (⎘)は、
Copy
を実装する型用に予約されています。 この場合、図に示すように、オブジェクトを使用するたびにコピーが行われます-分割。
2つの中心的なスキームは、所有するオブジェクトを借用する 2つの方法と、これらの各方法が提供するものを説明しています。
- 変数の借用の場合 、元のオブジェクトが借用の間ずっとロックされていることを示すために、ロック記号を使用しました。これにより、使用できなくなります。
- 反対の不変の借用では、スノーフレークシンボルを使用して、元のオブジェクトがフリーズされていることを示します。不変のリンクは引き続き取得できますが、移動または変更可能な参照は取得できません。
両方のスキームで、 'ρ
はリンクの存続期間を指定するために選択した名前です。 現時点では、Rustには特定のライフタイムを記述する構文がないため、ギリシャ文字を具体的に使用しました。
最後の2つのスキームは、イメージの形式とテキストの形式の両方で、2種類のリンクの主な違いと共通の機能を示しています。 Cell
似たものを通して内部的な可変性を持っている可能性があるため、指定子は「外側に」重要です。
翻訳者のメモ
翻訳とその後のレビューに協力してくれたAndrei Lesnikov ( @ozkiff )、Serhii Plyhun( @ snuk182 )、およびSergey Veselkov( @vessd )に感謝します。