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()
做同样的事情,而且更常见,所以为了保持一致性和避免混淆,我还是坚持使用它。谢谢你的提示!