Как я могу использовать типы, размер которых известен во время компиляции как длина массива, используя дженерики структур в ржавчине

Как я могу использовать дженерики с размером, который известен во время компиляции (являются Sized) как длина массива структур в зависимости от их размера

У меня есть следующая ошибка:

error: generic parameters may not be used in const operations
 --> src/lib.rs:4:43
  |
4 |     arr: [Key; 1024 / std::mem::size_of::<Key>()]
  |                                           ^^^ cannot perform const operation using `Key`
  |
  = note: type parameters may not be used in const expressions

для следующего кода

Ржавая площадка

type SomeKey = u64;

// This does not work
struct NotWorking<Key: Sized> {
    arr: [Key; 1024 / std::mem::size_of::<Key>()]
}

struct Working {
    arr: [SomeKey; 1024 / std::mem::size_of::<SomeKey>()]
}

Обратите внимание, что в Key: SizedSized является избыточным, поскольку оно неявно, т. е. Key: Sized то же самое, что и просто Key.

cafce25 02.09.2024 20:44
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Помимо встроенных типов, модуль типизации в Python предоставляет возможность определения общих типов, что позволяет вам определять типы, которые могут...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время это невозможно в стабильной версии, для этого требуется #![feature(generic_const_exprs)] и, следовательно, каждую ночь:

#![feature(generic_const_exprs)]
struct NotWorking<Key>
where
    // this where clause is required to constrain the generic, once GCEs
    // are complete its need might go away.
    [(); 1024 / std::mem::size_of::<Key>()]:,
{
    arr: [Key; 1024 / std::mem::size_of::<Key>()],
}

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