memo.log

技術情報の雑なメモ

所有権とかCopy, Cloneとか

以下だと、Testの get_name ではエラーになるけど、 Test2のget_age はエラーにならない。

cannot move out of self.name which is behind a shared reference move occurs because self.name has type String, which does not implement the Copy trait

struct Test {
  name: String
}

impl Test {
  fn get_name(&self) -> String{
    return self.name;
  }
}

struct Test2 {
  age: i32
}

impl Test2 {
  fn get_age(&self) -> i32 {
    // これは勝手に Copy されたということ?
    return self.age;
  }
}

fn main() {
  let test = Test{
    name: "akira".to_string()
  };
}

self.name は共有参照なので、所有権を動かせない、と出ている。 こういう場合は Copy trait が実装されている型なら return 時にCopyされるらしい。 実際、i32 の方は Copy されるから問題ないみたいだ。

そこはいいとして、 &self が共有参照というのがよくわからんな・・。明日もう少し調べよう。

いつ、引数で渡せるのか、渡せなくなるのか。 関数で渡した変数は、変更されるのかされないのか。

あとで読む

users.rust-lang.org

doc.rust-lang.org

doc.rust-lang.org