Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

所有権 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% の場合に正しい直感が得られることがわかっています。