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 上)
最佳答案
这是 Rust 借用检查程序的一个不幸的缺点。这本质上是因为
result.truncate(result.len() - 2)
相当于
String::truncate(&mut result, result.len() - 2)
在这里您可以看到,因为参数是按从左到右的顺序计算的,所以 result
在 result.len()
中使用之前确实是可变借用的.
我在 Rust 问题跟踪器中发现了这个问题:#6268 .此问题已关闭,有利于 non-lexical borrows RFC issue .看起来它只是那些在 1.0 之前可用但需要更多时间完成的事情之一。 This帖子也可能会引起一些兴趣(即使它已经快两年了)。
关于rust - 不能作为不可变借用 - String 和 len(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30532628/