Почему связанные константы не зависят от параметров типа?
Это просто ограничение тока или есть техническая причина? Поскольку обобщенные функции компилируются в специализированный код, я не вижу, что должно помешать ему работать. Он также отлично работает в функции main
.
Пример (игровая площадка):
#![feature(associated_consts)]
trait HasNumber<T> {
const Number: usize;
}
enum One {}
enum Two {}
enum Foo {}
impl<T> HasNumber<One> for T {
const Number: usize = 1;
}
impl<T> HasNumber<Two> for T {
const Number: usize = 2;
}
fn use_number<T, H: HasNumber<T>>() {
let a: [u8; H::Number] = unsafe { ::std::mem::uninitialized() };
}
fn main() {
let a: [u8; <Foo as HasNumber<One>>::Number] = unsafe { ::std::mem::uninitialized() };
println!("{}", <Foo as HasNumber<One>>::Number);
println!("{}", <Foo as HasNumber<Two>>::Number);
}
Ответы
Ответ 1
Короткий ответ: он еще не реализован, так как трудно получить право. Там даже открытый RFC с именем "Константы, которые зависят от параметров типа в общем коде" для него.
Длинный ответ:
Это был компилятор, который вызвал сбой компилятора. Он был "исправлен" @quantheory в PR 25091, сделав это ошибкой, а не сбоем. @quantheory прокомментировал, что
Мне еще не удалось решить проблему с размером массива или рекурсией для связанных констант, хотя я надеялся, что изменение, которое я сделал для шаблонов соответствия диапазонов, также может помочь в размерах массивов.
@quantheory также отмечает, что это будет оставаться ошибкой до тех пор, пока что-то вроде RFC 1062 не будет объединено. Комментарии к RFC всегда приветствуются, так как они могут затуманить забытые варианты использования.