gpt4 book ai didi

iterator - 迭代复制类型

转载 作者:行者123 更新时间:2023-11-29 08:12:49 29 4
gpt4 key购买 nike

很明显,迭代器传递引用以避免移动对象到迭代器或其闭包参数中,但是 Copy 类型呢?让我给你看一个小片段:

fn is_odd(x: &&i32) -> bool { *x & 1 == 1 }
// [1] fn is_odd(x: &i32) -> bool { x & 1 == 1 }
// [2] fn is_odd(x: i32) -> bool { x & 1 == 1 }

fn main() {
let xs = &[ 10, 20, 13, 14 ];

for x in xs.iter().filter(is_odd) {
assert_eq!(13, *x);
}

// [1] ...is slightly better, but not ideal
// for x in xs.iter().cloned().filter(is_odd) {
// assert_eq!(13, x);
// }
}

当我们迭代 &[i32]&[u8] 时,.cloned() 是首选,我说得对吗?哪里涉及额外的间接寻址而不是仅仅复制微小的数据单元?

但看起来我无法避免将引用传递给 is_odd 函数。

有没有办法让上面片段中的 [2] 函数适用于更高级别的函数,例如 filter

假设我明白将非 Copy 类型移动到 predicate 函数中是愚蠢的。但并非所有类型都默认使用 move 语义,对吗?

最佳答案

It is clear that iterators pass around a references

这个笼统的说法是不正确的,迭代器不仅能够产生非引用。 filter 将提供对闭包的引用,因为它不想将项目的所有权授予闭包。在您的示例中,您的迭代值是一个 &i32,然后 filter 提供一个 &&i32

Is there a way to make [2] function from above snippet work for higher-level functions like filter?

当然,只需提供一个执行取消引用的闭包:

fn is_odd(x: i32) -> bool { x & 1 == 1 }

fn main() {
let xs = &[ 10, 20, 13, 14 ];

for x in xs.iter().filter(|&&x| is_odd(x)) {
assert_eq!(13, *x);
}
}

关于iterator - 迭代复制类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33423947/

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