Rust 无法作为不可变项借用-String和len()

Rust 无法作为不可变项借用-String和len(),rust,immutability,mutability,borrow-checker,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)); 为什么??有没有办法改变这一点,使它可以写在一行?(请注意,这是关于锈蚀1.0的)这是锈蚀借用检查程序的一个不幸缺陷。这基本上是因为 let newl

但是,这是一个编译错误。与借用检查器和可能的易变性有关

let mut result = String::with_capacity(1000);

result.push_str("things... ");
result.push_str("stuff... ");

result.truncate((result.len() - 4));

为什么??有没有办法改变这一点,使它可以写在一行?(请注意,这是关于锈蚀1.0的)

这是锈蚀借用检查程序的一个不幸缺陷。这基本上是因为

let newlen = result.len() - 4;
result.truncate(newlen);
相当于

result.truncate(result.len() - 2)
在这里您可以看到,由于参数是按从左到右的顺序计算的,
result
在被用于
result.len()
之前确实是可变借用的


我在锈蚀问题跟踪程序中发现此问题:。这一问题以赞成票结束。它似乎只是那些在1.0之前就可以使用的东西中的一种,拥有它会很好,但是需要更多的时间来完成。这篇文章也可能会引起一些兴趣(尽管它已经将近两年了)。

这有助于澄清。这比什么都麻烦。因此,这个错误与需要可变性的
truncate
和需要不变性的
len
之间的冲突有关?似乎
result.len()
会在移交给truncate之前完成它的工作,这意味着这更像是一个编译器的怪癖?你几乎是对的-问题是
truncate
需要
&mut self
,这禁止在同一范围内进行任何后续借用。是的,似乎
result.len()
在交给
truncate()
之前就完成了,但是,我的回答解释了为什么不是这样-实际上,方法接收者是在参数之前计算的,因此
&mut result
result.len()
所需的
&result
之前的范围内,如果你对我的更新感兴趣,你可以在我链接的问题中找到更多。非常好的信息-非常感谢!把它归结为编译器的怪癖,这只是目前生活的一部分。
result.truncate(result.len() - 2)
String::truncate(&mut result, result.len() - 2)