Почему присвоение целочисленного значения из вектора другой переменной разрешено в Rust? - PullRequest
0 голосов
/ 15 октября 2019
fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let mut largest = number_list[0];

    for number in number_list {
        if number > largest {
            largest = number;
        }
    }

    println!("The largest number is {}", largest);
    assert_eq!(largest, 100);
}

Разве владение первым элементом в массиве не должно передаваться наибольшему и, следовательно, его нельзя использовать в цикле?

1 Ответ

1 голос
/ 15 октября 2019

number_list представляет собой список целых чисел, а целые числа реализуют черту Copy, что означает, что они никогда не перемещаются, а копируются вместо этого. По этой причине массив сохраняет владение своими элементами, и largest и number получают копии этих элементов.

Если вы попытаетесь сделать то же самое с типом, не связанным с копией, то вы получите ошибку:

struct WrappedInt(i32);

fn main() {
    let number_list = vec![34, 50, 25, 100, 65]
        .into_iter()
        .map(|x| WrappedInt(x))
        .collect::<Vec<_>>();

    let mut largest = number_list[0];

    for number in number_list {
        if number.0 > largest.0 {
            largest = number;
        }
    }

    println!("The largest number is {}", largest.0);
    assert_eq!(largest.0, 100);
}

детская площадка

дает:

error[E0507]: cannot move out of index of `std::vec::Vec<WrappedInt>`
 --> src/main.rs:9:23
  |
9 |     let mut largest = number_list[0];
  |                       ^^^^^^^^^^^^^^
  |                       |
  |                       move occurs because value has type `WrappedInt`, which does not implement the `Copy` trait
  |                       help: consider borrowing here: `&number_list[0]`
...