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

Rust 为什么此函数中的参数取消引用正确?,rust,Rust,刚开始生锈,仍然有点磕磕绊绊…我做了下面的函数,它可以正常工作 如果我有参数,如n=18,factors=&[3,6],函数将检查是否有任何“factors”是n的倍数 fn check_multiple(n: u32, factors: &[u32]) -> bool { factors.into_iter().filter(|&y| *y != 0).any(|z| n % z == 0) } 但是我试图理解中的“y”的引用和“去引用”是如何工作的。我的理解是“&

刚开始生锈,仍然有点磕磕绊绊…我做了下面的函数,它可以正常工作

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

fn check_multiple(n: u32, factors: &[u32]) -> bool {
  factors.into_iter().filter(|&y| *y != 0).any(|z| n % z == 0)
}
但是我试图理解
中的“y”的引用和“去引用”是如何工作的。我的理解是“&y”是“y的参考地址”。因此,您是否必须将其编写为
过滤器(|&y |*(&y)!=0).
以使用“*”获得y的正确“解引用”?

给出了一个带有
项=&t
的迭代器。传递给的闭包接受类型为
&Item
的参数。因此,在您的例子中,闭包接受类型为
&&u32
的参数。为了能够将此参数与0进行比较,需要去掉两级引用,这可以在参数定义中进行,也可以在使用
y
时进行。因此,您的选择是:

  • | y |**y!=0
    在使用时取消对两个级别的引用
  • |&y |*y!=0
    取消引用参数中的一个级别和使用中的一个级别
  • |&y | y!=0
    取消对参数中两个级别的引用
此外,由于
u32
实现了
Copy
,因此可以使用以下方法消除一级间接寻址:


PS:您可以通过添加故意错误的类型批注并查看错误消息来检查
y
的类型:

fn check_multiple(n: u32, factors: &[u32]) -> bool {
   factors.into_iter().filter (|y: ()| y != 0).any (|z| n % z == 0)
}
给出此错误消息:

error[E0631]:闭包参数中的类型不匹配
-->src/lib.rs:2:23
|
2 |因子.进入| iter().过滤器(| y:()| y!=0).任何(| z | n%z==0)
|^^^^------------找到了`fn(())->的签名_`
|                       |
|预期的`签名_`
将闭包参数的类型指定为:
&'r&u32

将给出一个带有
Item=&T
的迭代器。传递给的闭包接受类型为
&Item
的参数。因此,在您的例子中,闭包接受类型为
&&u32
的参数。为了能够将此参数与0进行比较,需要去掉两级引用,这可以在参数定义中进行,也可以在使用
y
时进行。因此,您的选择是:

  • | y |**y!=0
    在使用时取消对两个级别的引用
  • |&y |*y!=0
    取消引用参数中的一个级别和使用中的一个级别
  • |&y | y!=0
    取消对参数中两个级别的引用
此外,由于
u32
实现了
Copy
,因此可以使用以下方法消除一级间接寻址:


PS:您可以通过添加故意错误的类型批注并查看错误消息来检查
y
的类型:

fn check_multiple(n: u32, factors: &[u32]) -> bool {
   factors.into_iter().filter (|y: ()| y != 0).any (|z| n % z == 0)
}
给出此错误消息:

error[E0631]:闭包参数中的类型不匹配
-->src/lib.rs:2:23
|
2 |因子.进入| iter().过滤器(| y:()| y!=0).任何(| z | n%z==0)
|^^^^------------找到了`fn(())->的签名_`
|                       |
|预期的`签名_`

将闭包参数的类型设置为:
&'r&u32

“我的理解是,“&y”是y的引用地址”,是的,您是对的,现在
y
包含y值的引用。要获得
y
的值,您可以取消引用(
*y
),这样您就可以对“
y
”进行比较,我通常不会在切片上使用
到iter()
。只是
iter()
做同样的事情,而且更常见,所以为了保持一致性和避免混淆,我还是坚持使用它。谢谢你的提示!“我的理解是,“&y”是y的引用地址”,是的,你是对的,现在
y
包含了y值的引用。要获得
y
的值,您可以取消引用(
*y
),这样您就可以对“
y
”进行比较,我通常不会在切片上使用
到iter()
。只是
iter()
做同样的事情,而且更常见,所以为了保持一致性和避免混淆,我还是坚持使用它。谢谢你的提示!