我是Newby Rustacean(完成了沙沙作响的课程,到目前为止非常享受它).我在《铁 rust 》一书中遇到了一些闭包的例子.尤其是这一条:
fn main() {
let mut list = vec![1, 2, 3];
let mut borrows_mutably = || list.push(7);
borrows_mutably();
}
我们需要宣布关闭为mut
,这一事实对我来说很难理解.这是非常必要的,因为如果不将其声明为mut,编译器会抱怨:
calling `borrows_mutably` requires mutable binding due to mutable borrow of `list`
| |
| help: consider changing this to be mutable: `mut borrows_mutably`
|
| borrows_mutably();
| ^^^^ cannot borrow as mutable
我在这里和那里读了很多帖子,我的理解是关闭被要求定义为mut
,因为它正在改变它的环境.我不知道这个直觉是对是错.
无论如何,在try 另一个闭包时,我发现了一个打破我理解的例子.这一条:
fn main() {
let mut num_ops = 0;
let func = |r: &i32| {
num_ops += 1;
r.abs()
};
let mut list = [-3, 1, 5];
list.sort_by_key(func);
println!("{:?}, {}", list, num_ops);
}
我有一个闭包,用于按绝对值对整数列表进行排序,并计算发生了多少次操作.显然,这种关闭也在改变它的环境.但在本例中,我不需要将其声明为mut
,因为似乎不是在我的代码中调用闭包,而是将其传递给另一个函数(sort_by_key
),该函数将反过来调用它.为什么会有这样的行为?
我觉得这太让人困惑了.事实上,如果不是将函数传递给sort_by_key
,而是直接调用它,我会得到相同的错误(cannot borrow func as mutable...
).