我在这里有两个问题.
let a = [1, 2, 3];
assert_eq!(a.iter().find(|&&x| x == 2), Some(&2));
assert_eq!(a.iter().find(|&&x| x == 5), None);
Run Code Online (Sandbox Code Playgroud)
1.为什么&&x在闭包参数中使用而不仅仅是x?(我理解"&"正在传递一个对象的引用,但是两次使用它的意思是什么?)
这本书写道:
因为find()接受引用,并且许多迭代器遍历引用,这导致可能令人困惑的情况,其中参数是双引用.您可以在下面的示例中看到此效果,使用&& x.
但我真的不明白.
2.为什么&用而不是find()?
我想我在非常高的层次上理解Rust&和*Rust之间的区别,因为它与内存管理有关。
以下代码片段有什么区别。应用一种方法与另一种方法是否存在危险?
for (i, item) in bytes.iter().enumerate() {
if *item == b' ' {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
for (i, item) in bytes.iter().enumerate() {
if item == &b' ' {
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
据我了解,当我返回一个值时,iter()我将返回对bytes. 如果我想对项目进行比较,我需要在两个引用之间进行比较,&u8或者我需要自己进行&item引用,以便在我调用item它时是 type u8,或者我需要item在比较时取消引用,以便item= &u8- > *item= u8。 …