参照型 &T

参照型 &T

値を所有していないことを表す型。 &演算子(Borrow演算子)によって生成する。

借用

Rustでは、&演算子によって参照型を生成することを「値を借用する」という。

let a = String::from("a");

// 変数aの値を借用する
let b: &String = &a;

値のライフタイム

値の所有権を持たないため、参照型の変数のスコープは、値のスコープを超えることはできない。

let result: &String = match input {
    // 値のスコープを超える参照を返せない
    "1" => &String::from("Hello World"),
    _ => panic!("You occur system down"),
}

/*
 error[E0716]: temporary value dropped while borrowed
  |
5 |     let result = match input {
  |         ------ borrow later stored here
6 |         "1" => &String::from("Apple"),
  |                 ^^^^^^^^^^^^^^^^^^^^-
  |                 |                   |
  |                 |                   temporary value is freed at the end of this statement
  |                 creates a temporary which is freed while still in use
*/

値のライフタイムの付与

関数の返り値や型のメンバ変数に参照型を取る場合、値のライフタイムを手動で付ける必要がある。

参照型を返す場合

// 返す参照型のライフタイムは引数で受け取った値と同じことを保証する
fn max<'a>(str1: &'a str, str2: &'a str) -> &'a str {
    if str1.len() > str2.len() {
        str1
    } else {
        str2
    }
}

参照型をメンバ変数としてもつ場合

struct Foo<'a> {
    val: &'a i32,
}

コピーセマンティクス

型Tに関わらず、Copyトレイトを実装しているので、参照型はコピーセマンティクスとなる。

let mut origin = String::from("Origin");

let ref1 = &origin;
let ref2 = &ref1; // 参照がコピーされる
let ref3 = &ref2; // 参照がコピーされる

実装しているトレイト

  • Copy
  • Clone TがCloneを実装しているしていないに関わらず
  • Deref *演算子と自動参照外し
  • Borrow
  • Pointer

Tが実装している場合

  • PartialOrd
  • Ord
  • PartialEq
  • Eq
  • AsRef
  • Fn
  • Hash

参照

reference - Rust

References and Borrowing - The Rust Programming Language

関連

参照型とポインタ型 - あるマのメモ書き

自動参照外し (Auto-dereferencing) - あるマのメモ書き

所有権と借用 - あるマのメモ書き