for循环中的元组解构?

tuple destructuring in for loops?

编译并输出:i32

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

pub fn main() {
    let regions = [
        // From 0xe0000 to 0xfffff
        (0xe0000, 0xfffff),
    ];

    for (start, end) in &regions {
        print_type_of(start);
    }
}

这失败了

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

pub fn main() {
    let regions = [
        // From 0xe0000 to 0xfffff
        (0xe0000, 0xfffff),
    ];

    // NEW
    for &(start, end) in &regions {
        print_type_of(start);
    }
}


error[E0308]: mismatched types
  --> test.rs:12:27
   |
12 |             print_type_of(start);
   |                           ^^^^^
   |                           |
   |                           expected reference, found integer
   |                           help: consider borrowing here: `&start`
   |
   = note: expected reference `&_`
                   found type `{integer}`

为什么 for &(start, end) in &regions 捕获 startend 作为 int 值 但 for (start, end) in &regions 作为参考?

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

pub fn main() {
    let &a = &32_i32;
    let b = 32_i32;
    print_type_of(&a);
    print_type_of(&b);
}

输出将是:

i32
i32

在示例中,&a = &32_i32 等同于 b = 32_i32。左边值中的&将成为右边值的解引用,这是Destructuring Pointers的一部分。您的代码相当于:

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

pub fn main() {
    let regions = [
        // From 0xe0000 to 0xfffff
        (0xe0000, 0xfffff)
    ];

    // NEW
    for (start, end) in regions {
        print_type_of(start);
    }
}

所以(start, end) = (0xe0000, 0xfffff),start的类型是i32.