所有権のいろは

さて,リストを作ることができたので,それを使って何かできたらいいですね. そこで「通常の」(静的ではない) メソッドを使用します. メソッドは Rust の関数の中でも特殊で,self という型を持たない引数を取ります:

fn foo(self, arg2: Type2) -> ReturnType {
    // 関数の中で行う処理
}

self には,self, &mut self, &self という3つの主要な形があります. この3つの形態は,それぞれ Rust における所有権の3つの主要な形態に対応しています:

  • self - 値
  • &mut self - 可変参照
  • &self - 共有参照

値は,真の 所有権を表します.移動,破壊,変更,参照による貸し出しなど,値に対してやりたいことは何でもできます.値として何かを渡すと,その値は新しい場所に ムーブ されます. 新しい場所がその値を所有することになるので,古い場所はもうその値にアクセスできなくなります. このため,ほとんどのメソッドは self を必要としません. リストを一度使ったら,もう使えないというのではかなりイライラしますね.

可変参照は,自分が所有していない値への一時的で排他的なアクセスを表します. 可変参照している値に対しては,終了時に有効な状態で残しておけば,何をやっても許されます. (無効にしてしまったら,所有者に対して失礼です!) つまり,完全に値を上書きすることもできます. ある値を別の値に入れ替えることができるので,これは本当に便利です.私たちも後でたくさん使うことになるでしょう. &mut でできないことは,置換せずに値をムーブすることだけです. &mut self は,self を変更したいメソッドにぴったりです.

共有参照は,自分が所有していない値への一時的な共有アクセスを表します. 共有アクセスなので,一般的には何も変更することができません. これは,値を博物館に展示するようなものだと考えてください. &self は,self を観察するだけのメソッドに最適です.

後に,値の変更に関するルールを迂回できるケースがあることを紹介します. 共有参照が 不変参照 と呼ばれないのはこのためです. 本来なら可変参照も 一意参照 (訳注: 原文は unique references) と呼んだ方がいいかもしれませんが,所有権と変性 (訳注: 原文は mutability で,値が変更できるかどうかという性質) を結びつけることで 99% のケースで直感的にわかりやすくなります.