gpt4 book ai didi

rust - 为什么此参数在此Rust函数中正确取消引用?

转载 作者:行者123 更新时间:2023-12-03 11:43:15 26 4
gpt4 key购买 nike

Rust的新手,仍然有些绊脚石...我做了以下功能,该功能可以按预期工作。

如果我有诸如n = 18factors = &[3, 6]之类的参数,该函数将检查是否有任何“因子”是n的倍数。

fn check_multiple(n: u32, factors: &[u32]) -> bool {
factors.into_iter().filter(|&y| *y != 0).any(|z| n % z == 0)
}

但是我试图了解 .filter(|&y| *y != 0)中“y”的引用和“解引用”是如何工作的。我的理解是“&y”是“y的引用地址”。因此,您是否不应该将其编写为 filter(|&y| *(&y) != 0)...来使用“*”获得y的正确“解引用”?

最佳答案

&[T]::into_iter() 给出一个带有Item = &T的迭代器。传递给 Iterator::filter 的闭包采用&Item类型的参数。因此,在您的情况下,闭包采用&&u32类型的参数。为了能够将此参数与0进行比较,您需要摆脱两个引用级别,可以在参数定义中或在使用y时执行此操作。因此,您的选择是:

  • |y| **y != 0取消引用两个级别的使用,
  • |&y| *y != 0在参数中取消引用一级,在使用时取消引用
  • |&&y| y != 0取消引用参数中的两个级别。

  • 此外,由于 u32实现了 Copy,因此您可以使用 Iterator::copied 摆脱一级间接访问:
    factors.into_iter().copied().filter (|&y| y != 0)

    PS:您可以通过添加故意错误的类型注释并查看错误消息来检查 y的类型:
    fn check_multiple(n: u32, factors: &[u32]) -> bool {
    factors.into_iter().filter (|y: ()| y != 0).any (|z| n % z == 0)
    }

    给出此错误信息:

    error[E0631]: type mismatch in closure arguments
    --> src/lib.rs:2:23
    |
    2 | factors.into_iter().filter (|y: ()| y != 0).any(|z| n % z == 0)
    | ^^^^^^ -------------- found signature of `fn(()) -> _`
    | |
    | expected signature of `for<'r> fn(&'r &u32) -> _`

    将闭包参数的类型指定为: &'r &u32

    关于rust - 为什么此参数在此Rust函数中正确取消引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61473619/

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