7
let mut result = String::with_capacity(1000);
result.push_str("things... ");
result.push_str("stuff... ");
result.truncate((result.len() - 4));
但是,這是一個編譯錯誤。與借用檢查器有關,可能是可變性。不能借用不可變 - String和len()
error[E0502]: cannot borrow `result` as immutable because it is also borrowed as mutable
--> <anon>:7:22
|
7 | result.truncate((result.len() - 4));
| ------ ^^^^^^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
但是,如果我稍微改變它允許我這樣做:
let newlen = result.len() - 4;
result.truncate(newlen);
爲什麼?有沒有辦法改變它,所以它可以寫在一行? (P.S.這是在Rust 1.0上)
這有助於澄清。這比任何事情都更令人煩惱。所以這個錯誤與'truncate'需要可變性和'len'需要不可變性之間的衝突有關?看起來'result.len()'在交給截斷之前完成了它的工作,這意味着它比任何東西都更像編譯器怪癖嗎? http://doc.rust-lang.org/std/string/struct.String.html#method.len – jocull
你幾乎是正確的 - 問題是'truncate'需要'&mut self',它禁止任何*後續在同一範圍內借款。是的,它會* *看起來'result.len()'在它交給'truncate()'之前完成,但是,我的答案解釋了爲什麼它不是這樣 - 實際上,方法接收器是在*之前計算的*參數,因此'&mut result'在'result.len()'所要求的''&result'之前的作用域*中。 –
@jocull,如果你對它感興趣,你可以在我的更新中鏈接到的問題中找到更多信息。 –