5 votes

Constantes associées en condition de constante ìf`-expression

J'essaie d'utiliser des constantes associées comme condition dans un fichier de type if -pour initialiser une autre constante. Je pense que cela devrait fonctionner, car je peux utiliser les constantes associées directement pour initialiser une autre constante, de sorte que cela est applicable dans un contexte de constantes et que l'expression if ne dépend pas d'autres valeurs.

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 };
}

Lorsque je compile ceci, j'obtiens une erreur :

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

Je ne suis pas sûr de ce que le compilateur veut me dire. J'ai ajouté i32 pour s'assurer que les littéraux sont effectivement i32 pour éviter tout problème lié à des types différents dans les branches, mais cela n'a pas aidé non plus.

5voto

phimuemue Points 11644

Pour autant que je sache, if et d'autres ne sont pas (encore) supportés dans const contextes.

Cependant, il est souvent possible d'obtenir un effet similaire en suivant le modèle suivant :

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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X