这个问题在这里已经有了答案:
Mutably borrow one struct field while borrowing another in a closure
(2 个回答)
2年前关闭。
有什么区别
let book_scores = &system.book_scores;
library.books.sort_unstable_by_key(|b| book_scores[*b]);
和
library.books.sort_unstable_by_key(|b| &system.book_scores[*b]);
?
编译器允许第一个,第二个失败
error[E0502]: cannot borrow
system
as immutable because it is also borrowed as mutable
libraries
是 system
的字段, library
是 libraries
的一个元素在一个 for 循环中for library in &mut system.libraries {
最佳答案
不同之处在于闭包的变量绑定(bind)很浅。考虑以下闭包:
let closure = || println!("{}", a.b.c.d);
由于闭包没有定义
a
, a
是从它的外部环境中借来的。实际调用时,闭包访问 .b.c.d
关于借来的a
.闭包不会立即计算
a.b.c.d
并借用它。如果是这样,它将无法注意到对 a.b
的更改。或 a.b.c
甚至a.b.c.d
.同样,如果它捕获了 a.b.c
在创建和访问 .d
调用时,它无法响应对 a.b
的更改或 a.b.c
.如果您需要预先捕获表达式的一部分,则需要使其明确,就像您的第一个片段一样。
关于rust - 在闭包内独立借用结构的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60393639/