Pull to refresh

Comments 9

const-генерики всё еще очень слабые. Тип const-генерика обязан иметь выведенный (аннотацией derive) трейт PartialEq.
Это в принципе логично — так компилятор может сравнивать константы на этапе компиляции. Но можно было бы сравнивать, и, к примеру, ссылки, ведущие на один и тот же немутабельный объект. Так можно вынести некоторые проверки на этап компиляции.

Мне кажется вы что-то перепутали, сейчас в стабильном расте тип const-generic параметра вообще может быть только числом, bool и char, свои типы нельзя использовать даже с #[derive(PartialEq)].

Подобное ограничение есть в паттерн матчинге, там константные паттерны работают только с типами у которых есть derive(PartialEq, Eq), но там и ссылки работают:

#[derive(PartialEq, Eq)]
struct Derived(i32);
struct Manual(i32);

impl Eq for Manual {}
impl PartialEq for Manual { ... }

const D: Derived = Derived(0);
const DR: &'static Derived = &Derived(0);
const M: Manual = Manual(0);

match Manual(1) {
    // error: to use a constant of type `Manual` in a pattern, `Manual` must be annotated with `#[derive(PartialEq, Eq)]`
    M => println!("zero???"),
    _ => println!("non-zero :("),
}

match Derived(1) {
  D => println!("zero!"), // ok
  _ => println!("non-zero :("),
}

match &Derived(1) {
  DR => println!("zero!"), // ok
  _ => println!("non-zero :("),
}

PartialEq работает в Nightly с #![feature(adt_const_params)]. В стейбле еще более грустно, да.

UFO just landed and posted this here

я удивлен, что полный перевод аж почти целые сутки провисел пока модераторы до него не добрались. ну и логика их действий понятна - боятся, что иначе весь хабр прикроют :/

Это правило должно действовать всегда.

UFO just landed and posted this here

Это страна существует уже почти 250 лет, а вы только заметили - поздравляю :-D

Sign up to leave a comment.

Articles