gpt4 book ai didi

rust - 用 FnMut 理解 Iter

转载 作者:行者123 更新时间:2023-12-05 00:42:28 25 4
gpt4 key购买 nike

自从 Iter's "all" fn takes type FnMut是否可以在检查条件和短路时更新元素?虽然我知道它不应该这样做,但是是什么阻止它更新值?

fn main() {
let a = ["as", "zz"];

let mut iter = a.iter();
iter.all(|& (mut x)| {x = "cc"; true});

for z in a.iter(){
println!("{z}");
}
}

上图

as
zz

在上述情况下,为什么设置“x = cc”不起作用?或者,当它不应该发生变异而只验证条件时,为什么 Iter“all”方法采用 FnMut 类型的 F 而不是 Fn

最佳答案

x = "cc" 不会更改 x 引用的值,而是更改引用本身(即,它使其引用另一个值),如证据所示通过这个例子:

fn main() {
let a = ["as", "zz"];

let mut iter = a.iter();
iter.all(|&(mut x)| {
println!("before: {:?}", x as *const _);
x = "cc";
println!("after: {:?}", x as *const _);
true});

for z in a.iter(){
println!("{z}");
}
}

Playground

请注意,这与闭包是 FnMut 的事实无关,这只意味着它可能会更改任何捕获的值,如下所示:

fn main() {
let a = ["as", "zz"];

let mut count = 0;
let mut iter = a.iter();
iter.all(|&_x| {
count += 1; // This is possible because the closure is `FnMut`
true});
println!("Count: {count}");

for z in a.iter(){
println!("{z}");
}
}

Playground

关于rust - 用 FnMut 理解 Iter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73650824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com