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

时间:2017-07-19 17:58:03

标签: rust

编译器说e1: &i32e2: i32。阅读了文档for slice::Iterthe book chapter on loops之后,我仍然感到困惑。

更一般地说,切片中的特定元素是否可以拥有?似乎在案例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
    }
}

1 个答案:

答案 0 :(得分:4)

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

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`

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

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

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

if let Some(&val) = a_value {
    let () = val; // expected type `i32`
}

请注意val不再是&#34;包裹&#34;通过Some,就像它已经不再包装了#34;通过参考。

&模式中的这种行为是需要ref关键字的原因。 ref关键字用于在模式匹配中明确地引入引用。