其實是個問答帖,官方回答問題太多了,不想回答了,
看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 協議》,轉載必須註明作者和本文連結