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)