Каким образом Rust определяет длину среза при масштабировании из массива? - PullRequest
1 голос
/ 01 мая 2020

Я знаю, что ломтик похож на fatptr: (data_ptr, len). Когда я разрезаю массив на слайс:

let arr = [0; 10];
let slice_arr = &arr[..];

Массив не имеет поля длины, такого как Vec<T>.

Я знаю, что slice_arr.len() может получить длину среза, потому что slice_arr имеет поле длины. Как Rust знает поле длины, когда массив преобразуется в срез?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Массив имеет своего рода "параметр" длины. Это не поле, это часть типа:

let x: [u8; 2] = [1, 2];
let y: [u8; 3] = x; // Error here

Тип x равен [u8; 2]. Количество элементов всегда 2, а тип элементов всегда u8.

Поскольку [u8; 2] и [u8; 3] являются разными типами, один имеет длину всегда ровно 2 u8 с, а другой * всегда ровно 3 u8 s долго, назначение от x до y не выполняется.

При выполнении определенных операций с массивами компилятор имеет специальную встроенную семантику для массивов. Эта встроенная семантика может использовать длину «параметра» (N в [T; N]). Вы можете получить доступ к этому значению на уровне типа, используя const generics, но сейчас это только ночная функция.

0 голосов
/ 01 мая 2020

Используйте метод .len.

use std::io::stdin;

fn main() {
    let arr = [0; 10];
    let slice_arr = &arr[..];
    println!("first element of the slice: {}", slice_arr[0]);
    println!("the slice has {} elements", slice_arr.len());
}

https://doc.rust-lang.org/stable/rust-by-example/primitives/array.html

...