Ассоциированные константы в состоянии постоянного выражения «f» - PullRequest
0 голосов
/ 04 января 2019

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

trait C {
    const c: i32;
}

trait StaticAssert<T1: C, T2: C> {
    const canUseAssociatedConst: i32 = T1::c;
    const canCompareAssociatedConst: bool = T1::c == T2::c;

    const check: i32 = if T1::c == T2::c { 1 } else { 0 };
}

Когда я компилирую это, я получаю сообщение об ошибке:

error[E0019]: constant contains unimplemented expression type
 --> src/lib.rs:9:24
  |
9 |     const check: i32 = if T1::c == T2::c { 1 } else { 0 };
  |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Я не уверен, что компилятор хочет сказать мне.Я добавил i32 суффиксы, чтобы убедиться, что литералы на самом деле являются i32 значениями, чтобы не допустить проблем с различными типами в ветвях, но это тоже не помогло.

1 Ответ

0 голосов
/ 04 января 2019

Насколько я знаю, if и другие (пока) не поддерживаются в const контекстах.

Однако, часто вы можете добиться аналогичного эффекта в соответствии со следующим:

trait C {
    const c: i32;        
}

trait StaticAssert<T1:C, T2:C> {
    const canUseAssociatedConst: i32 = T1::c;
    const canCompareAssociatedConst: bool = T1::c == T2::c;

    const check: i32 = (T1::c == T2::c) as i32;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...