Reference 为什么是&&&引用;在闭包参数中使用?
我有两个问题:Reference 为什么是&&&引用;在闭包参数中使用?,reference,rust,borrowing,Reference,Rust,Borrowing,我有两个问题: 为什么在闭包参数中使用&&x,而不仅仅是x?我知道&是传递一个对象的引用,但是两次使用它意味着什么 我不明白文件上说了什么: 因为find()接受一个引用,并且许多迭代器在引用上迭代,这可能会导致一种混淆的情况,即参数是双重引用。使用&&x可以在下面的示例中看到这种效果 为什么使用Some(&2)而不是Some(2) 1) 我认为这本书的解释很好,也许我下面的.cloned()示例会很有用。但是由于.iter()迭代引用,您必须另外指定引用,因为find需要引用 2) .ite
&&x
,而不仅仅是x
?我知道&
是传递一个对象的引用,但是两次使用它意味着什么
我不明白文件上说了什么:
因为find()
接受一个引用,并且许多迭代器在引用上迭代,这可能会导致一种混淆的情况,即参数是双重引用。使用&&x
可以在下面的示例中看到这种效果
Some(&2)
而不是Some(2)
.cloned()
示例会很有用。但是由于.iter()
迭代引用,您必须另外指定引用,因为find
需要引用
2) .iter()
正在迭代引用;因此,您可以找到一个参考
您可以使用.cloned()
查看如果不必处理引用,它会是什么样子:
assert_eq!(a.iter().cloned().find(|&x| x == 2), Some(2));
a
的类型为[i32;3]
;三个i32
s的数组。
[i32;3]
没有实现iter
方法,但它确实解除了对和[i32]
的引用。
它生成一个迭代器。
实现迭代器
它使用&i32
而不是i32
,因为迭代器必须处理任何类型的数组,并且并非所有类型都可以安全复制。因此,它不是将自身限制为可复制类型,而是通过引用而不是通过值对元素进行迭代
为所有迭代器定义。它允许您查看每个元素并返回与谓词匹配的元素。问题:如果迭代器生成不可复制的值,那么将该值传递到谓词将使其无法从find
返回。无法重新生成该值,因为迭代器(通常)不可倒带或重新启动。因此,find
必须通过引用而不是通过值将元素传递给谓词
因此,如果有一个迭代器实现了iterator
,那么iterator::find
需要一个谓词,该谓词接受&T
并返回bool
<代码>[i32]:iter
生成一个迭代器,该迭代器实现了迭代器
。因此,对数组迭代器调用的Iterator::find
需要一个谓词,该谓词采用&&i32
。也就是说,它向谓词传递指向所讨论元素的指针
因此,如果要编写a.iter().find(|x |…)
,那么x
的类型将是&i32
。这不能直接与文字i32
值2
进行比较。有几种方法可以解决这个问题。一种是显式地取消引用x
:a.iter().find(|x |**x==2)
。另一种是使用模式匹配来分解双重引用:a.iter().find(|&x | x==2)
。在这种情况下,这两种方法的作用完全相同。[1]
至于为什么使用Some(&2)
:因为a.iter()
是&i32
的迭代器,而不是i32
的迭代器。如果您查看Iterator::find
的文档,您将看到对于Iterator
,它返回一个选项。因此,在本例中,它返回一个选项
,因此您需要将其与之进行比较
[1] :只有在谈到非复制类型时,差异才有意义。例如,|和&x |..
无法处理&&String
,因为您必须能够将字符串从引用后面移出,这是不允许的。但是,|x |**x..
会起作用,因为它只是到达引用内部,没有移动任何东西。谢谢!此外,如果任何人不理解什么是“解引用到&[i32]
”,可以根据,
assert_eq!(a.iter().cloned().find(|&x| x == 2), Some(2));