所有権 101
リストを構築できるようになったので、それを使って何かを行えるとよいでしょう。
それは「通常の」(非 static)メソッドで行います。Rust においてメソッドは関数の特殊な
ケースです。なぜなら、宣言された型を持たない self 引数があるからです。
fn foo(self, arg2: Type2) -> ReturnType {
// 本体
}
self が取り得る主な形式は 3 つあります: self、&mut self、&self です。
これら 3 つの形式は、Rust における所有権の主な 3 つの形式を表します。
self- 値&mut self- 可変参照&self- 共有参照
値は真の所有権を表します。値に対しては好きなことを何でもできます。
移動したり、破棄したり、変更したり、参照を通じて貸し出したりできます。何かを値渡しすると、
それは新しい場所へ移動されます。新しい場所がその値を所有するようになり、
古い場所からはもうそれにアクセスできなくなります。このため、ほとんどのメソッドは
self を望みません。リストを操作しようとしただけでそれが消えてしまうとしたら、
かなり残念でしょう!
可変参照は、自分が所有していない値への一時的な排他的アクセスを表します。
可変参照を持っている値に対しては、作業を終えたときにそれを有効な状態のままにしておく限り、
本当に好きなことを何でも行えます(そうしないと所有者に失礼でしょう!)。これは、実際に値を完全に
上書きできることを意味します。この非常に有用な特殊ケースが、ある値を別の値と入れ替えることです。
これはこれから頻繁に使います。&mut でできない唯一のことは、代わりの値を置かずに
値を取り出して移動することです。&mut self は、self を変更したいメソッドに最適です。
共有参照は、自分が所有していない値への一時的な共有アクセスを表します。
共有アクセスを持っているため、通常は何かを変更することは許されません。
& は、その値を博物館の展示に出すようなものだと考えてください。
& は、self を観察するだけのメソッドに最適です。
後ほど、変更に関するこのルールは特定の場合に回避できることを見ていきます。 これが、共有参照が不変参照と呼ばれない理由です。実際には、 可変参照は一意参照と呼ぶこともできますが、所有権を可変性と関連付けると、 99% の場合に正しい直感が得られることがわかっています。