gpt4 book ai didi

rust - 如何匹配 `&(&usize, &u32)` 之类的模式?

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

假设我有素数和幂的向量:

let mut primes: Vec<usize> = ...;
let mut powers: Vec<u32> = ...;

事实是primes.len() == powers.len() .

我想向用户返回一个相应幂值为 0 的素数列表(这段代码缺少正确的 refs 和 derefs):

primes.iter().zip(powers)
.filter(|(p, power)| power > 0)
.map(|(p, power)| p)
.collect::<Vec<usize>>()

正如您想象的那样,编译器提示很多。特别是 filter正在接收 &(&usize, &u32) 类型的参数,但我没有在模式匹配中正确取消引用。我尝试了编译器建议的各种模式(例如 &(&p, &power) ,这是对我来说最有意义的模式),但没有成功。如何正确执行模式匹配以便我可以执行 power > 0比较没有问题,这样我就可以最后收集一个Vec<usize>

最佳答案

primes.iter().zip(powers)

iter() 通过引用迭代,所以你得到 &usize 素数元素。 OTOH .zip() 调用 .into_iter() 迭代拥有的值,所以权力是 u32,这些迭代器组合迭代 (&usize, u32)。从技术上讲,迭代这种混合类型没有任何问题,但不一致可能会造成混淆。您可以在素数上使用 .into_iter().iter().cloned() 来避免引用,或者调用 .zip(powers.iter() ) 获取两者作为引用。

第二件事是 .filter() 通过引用获取项目 &(_,_) (因为它只“看”它们),并且 .map() 由拥有的值 (_,_) (允许它更改并返回它)。

对于像整数这样的小值,您通常会像这样使用这些方法:

.filter(|&item| …)
.map(|item| …)

请注意,在闭包中,语法是|pattern: type|,因此在上面的示例中,&item 等同于:

.filter(|by_ref| {
let item = *by_ref;
})

关于rust - 如何匹配 `&(&usize, &u32)` 之类的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48028913/

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