Почему я не могу написать функцию того же типа, что и Box::new?

Если я напишу функцию, которая принимает один аргумент типа [f32] (в отличие от, например, &[f32]) Я получаю ошибку:

the trait bound `[f32]: std::marker::Sized` is not satisfied

Документы говорят, что это потому, что [f32] не имеет размера, известного во время компиляции. Разумное ограничение. Справедливо.

Однако в стандартной библиотеке этого типа есть хотя бы одна функция. Вот я и называю это:

let b: Box<[f32]> = Box::new([1.0, 2.0, 3.0]);

Почему это разрешено в стандартной библиотеке, а не в моем коде? В чем разница? (Там нет очевидной магии в источнике).

1 ответ

Решение

[f32] Негабаритный. Тем не мение, [1.0, 2.0, 3.0] размер... его тип [f32; 3],

Это то что T будет при компиляции со стандартным библиотечным кодом, [f32; 3] размерный массив.

Чтобы принять размерный массив самостоятельно, вы можете сделать то же самое:

fn my_func(array: [f32; 3]) {
    // Implementation here
}

my_func([1.0, 0.0, 0.0]);

Нажмите здесь, чтобы увидеть рабочий образец на игровой площадке

&[f32] ломтик тоже имеет размеры.. поэтому он также допускается.

Как указывает Лукас в комментариях, срезы являются "жирным указателем" ( Вы можете прочитать о динамически изменяемых типах в Nomicon). Указатели жирных срезов состоят из указателя на фрагмент данных и значения, представляющего, насколько велики эти данные.

Другие вопросы по тегам