rust - 在闭包内独立借用结构的字段

标签 rust

这个问题在这里已经有了答案:





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


librariessystem 的字段, librarylibraries 的一个元素在一个 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/

相关文章:

Rust Diesel 无法编译并出现链接器错误

rust - iter和into_iter有什么区别?

opengl - Rust 和 OpenGL 设置

rust - 有没有办法在不事先检查的情况下捕获 "division by zero"错误?

rust - 如何使用 Assembly (NASM) 引导加载程序编译 Rust 内核

generics - 简化具有重复关联类型限制的 where 子句

vector - 如何创建堆栈分配的类似矢量的容器?

rust - 重新定义中缀运算符的特征

winapi - 我在哪里可以找到 Rust 的 winapi crate 中的语言环境信息常量?

module - 如何将我的程序划分为模块?