Преобразует ли Rust неявно прямые срезы в ссылки на срезы? - PullRequest
0 голосов
/ 05 мая 2020

Например, это одно и то же, или выполнение let x = myar[2] клонирует число 3 и помещает его в x?

let myar = [1, 2, 3, 4, 5];
let x = myar[2];
let x = &myar[2];

1 Ответ

3 голосов
/ 05 мая 2020

Нет.

let x = myar[2]; действительно копирует значение 3 и сохраняет его в x, а let x = &myar[2]; сохраняет ссылку на значение 3 в myar.

Обратите внимание, что единственная причина, по которой let x = myar[2]; вообще работает, заключается в том, что i32 реализует трейт Copy. Если бы у нас был массив, хранящий тип, который не реализует черту Copy, вы бы вообще не смогли этого сделать. Например:

struct Number {
    num: i32,
}

impl Number {
    fn new(num: i32) -> Number {
        Number { num }
    }
}
// Note that Number does not implement the Copy trait

fn main() {
    let number_list = [Number::new(1), Number::new(2), Number::new(3)];

    // This does not work:
    let _x = number_list[1];

    // This does work:
    let _x = &number_list[1];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...