可變所有權型別

vms_g發表於2019-12-19

其實是個問答帖,官方回答問題太多了,不想回答了,
看String的add方法的原始碼看到的一段程式碼,有點腦袋繞,記錄下。

下面這個是簡單的例項

#[derive(Debug)]
struct B {
  name:String
}

impl B {
  fn push(mut self, s:&str) ->Self {
    self.name.push_str(s);
    self
  }
}

對可變的認識一直是在可變繫結這塊,比如有個結構體B,這樣建立一個可變的繫結

 let mut x = B{name:String::from("abc")};

建立一個可變的變數x,並繫結到結構體B的例項,x擁有B的這個例項的所有權,B結構體有個方法push,,可以呼叫

let x = x.push("a");

這樣子沒有任何問題,對之前的所有權理解的也是這樣的。但我仔細想了下換了另外一種方式呼叫

let x = B{name:String::from("abc")}.push("ii");

也沒錯,正常編譯和執行,繞就繞在一個型別的可變不用指定mut嗎?暫時沒理解,有理解的可以評論說下


做了幾個實現,感覺還是引用和所有權沒有理解透,只要函式使用了所有權物件的可變引數,則只需要把例項轉移過來即可,是否由變數繫結(可變和非可變)都無關緊要。
變數繫結不是對這個例項的引用(不要考慮記憶體儲存),就應該當做就是這個例項型別
fn main() {
    let x1 = B{name:String::from("abc")};
    let mut x2 = B{name:String::from("123")};
    mut_test(x1);
    mut_test(x2);
}

fn mut_test(mut s:  B) {// mut去掉會編譯異常
    s.name.push_str("abc");
    println!("{}", s.name);
}
其實腦袋還是沒理解透 引用和所有權的關係

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章