当用作for循环变量时,“ e1”和“&e2”之间有什么区别?

qwe*_*iop 3 rust

编译器说e1: &i32e2: i32。已经阅读文档用于slice::Iter上环的书章,我仍然困惑。

更一般而言,切片中的特定元素是否可以拥有?似乎在情况2中,e2拥有一个元素,对吗?

fn main() {
    let slice = &[1, 2, 3];
    for e1 in slice.iter() {
        println!("{}", e1); // case 1
    }

    for &e2 in slice.iter() {
        println!("{}", e2); // case 2
    }
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 6

解构模式绑定中使用时,“&”符号&用于取消引用值:

let a_number: i32 = 42;
let a_reference_to_a_number: &i32 = &a_number;

let another_reference = a_reference_to_a_number;
let &another_number = a_reference_to_a_number;

let () = another_reference; // expected type `&i32`
let () = another_number;    // expected type `i32`
Run Code Online (Sandbox Code Playgroud)

这适用于任何接受模式的地方,例如在letif let中作为函数参数,for循环变量或匹配臂。


虽然最初使许多人感到困惑,但实际上这是与枚举和结构模式匹配并因此从内部变量绑定中删除的语言一致的语言:

let a_value: Option<&i32> = Some(&42);

if let Some(&val) = a_value {
    let () = val; // expected type `i32`
}
Run Code Online (Sandbox Code Playgroud)

请注意,val它不再被“包装” Some,就像它不再被引用“包装”一样。

&in模式的这种行为就是为什么ref需要关键字的原因。所述ref关键字被用于明确地介绍在一个模式匹配的参考。