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);
为什么呢?有没有办法改变它,所以它可以写在一行? (P.S.这是在Rust 1.0上)
答案 0 :(得分:10)
这是Rust借阅检查程序的一个不幸的缺点。这基本上是因为
result.truncate(result.len() - 2)
相当于
String::truncate(&mut result, result.len() - 2)
在这里你可以看到,因为参数是按从左到右的顺序计算的,所以result
在result.len()
中使用之前确实是可以借用的。{/ p>
我在Rust问题跟踪器中发现了这个问题:#6268。此问题已被关闭,有利于non-lexical borrows RFC issue。它似乎只是其中一个很好的东西,但需要更多的时间来完成它在1.0之前可用。 This帖子也可能有一些兴趣(即使它差不多两年了)。