9
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);

为什么?有没有办法改变它,所以它可以写在一行中?(PS 这是在 Rust 1.0 上)

4

1 回答 1

10

这是 Rust 借用检查过程的一个不幸的缺点。这基本上是因为

result.truncate(result.len() - 2)

相当于

String::truncate(&mut result, result.len() - 2)

在这里您可以看到,因为参数是按从左到右的顺序计算的,result所以在用于result.len().

我在 Rust 问题跟踪器中发现了这个问题:#6268。此问题已关闭,有利于非词汇借用 RFC 问题。似乎它只是其中一件很高兴的事情,但需要更多时间才能完成,因为它在 1.0 之前可用。这篇文章也可能会引起一些兴趣(即使它已经有将近两年的历史了)。

于 2015-05-29T15:09:23.813 回答