Почему я не могу написать функцию того же типа, что и 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). Указатели жирных срезов состоят из указателя на фрагмент данных и значения, представляющего, насколько велики эти данные.