let mut result = String::with_capacity(1000);
result.push_str("things... ");
result.push_str("stuff... ");
result.truncate((result.len() - 4));
然而,这是一个编译错误。与借用检查器和可能的可变性有关。
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);
为什么?有没有方法可以将其改写成一行代码?(注:这是在 Rust 1.0 上)
truncate
需要可变性和len
需要不可变性之间的冲突有关?看起来result.len()
会在交给truncate
之前完成其工作,这意味着这更多是编译器的怪癖而已?http://doc.rust-lang.org/std/string/struct.String.html#method.len - joculltruncate
需要&mut self
,这会禁止在同一作用域中进行任何后续借用。而且,是的,似乎result.len()
在交给truncate()
之前就已经完成了,但是,我的答案解释了为什么不是这样 - 实际上,在计算方法接收器之前,参数就已经计算出来了,因此&mut result
在&result
所需的result.len()
之前就在作用域内了。 - Vladimir Matveev