rust - 不能作为不可变借用 - String 和 len()

标签 rust immutability mutability borrow-checker

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)

在这里您可以看到,因为参数是按从左到右的顺序计算的,所以 resultresult.len() 中使用之前确实是可变借用的.

我在 Rust 问题跟踪器中发现了这个问题:#6268 .此问题已关闭,有利于 non-lexical borrows RFC issue .看起来它只是那些在 1.0 之前可用但需要更多时间完成的事情之一。 This帖子也可能会引起一些兴趣(即使它已经快两年了)。

关于rust - 不能作为不可变借用 - String 和 len(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30532628/

相关文章:

ios - "Cannot assign to property: "任何 "is immutable"错误

functional-programming - 什么时候可以修改函数式语言中的变量?

python - 数据帧参数被函数更改。如何避免其变异?

python - 通过引用传递 pandas DataFrame

f# - 就捕获而言,可变 vs Ref 变量

rust - 使用 Chrono 计算现在和下一个午夜之间的持续时间

types - 有没有办法创建只接受一系列值的数据类型?

rust - 是否可以使用变量作为格式的fill参数!宏?

Rust 中类似 Golang 的延迟

java - 为什么 Primitives 的包装类没有 setter?