Dans l'un de mes projets Rust, j'ai une hiérarchie d'énumérations à plusieurs niveaux. Voici une version simplifiée (lien vers l'aire de jeux):

enum Child {
    ChildA,
    ChildB,
}

enum Parent {
    ParentA(Child),
    ParentB,
}

enum GrandParent {
    GrandParentA(Parent),
    GrandParentB,
}

Pour plus de commodité, j'ai implémenté des convertisseurs entre chaque niveau et le niveau supérieur:

impl From<Child> for Parent {
    fn from(c: Child) -> Self {
        Parent::ParentA(c)
    }
}

impl From<Parent> for GrandParent {
    fn from(p: Parent) -> Self {
        GrandParent::GrandParentA(p)
    }
}

Si je veux convertir un Child en Parent, je peux maintenant faire

let c: Child = Child::ChildA;
let p: Parent = c.into();

Mais si je veux convertir un Child en un Grandparent, je n'arrive pas à enchaîner plusieurs appels vers into():

let c: Child = Child::ChildA;
let gp: GrandParent = c.into().into();

error[E0282]: type annotations needed
  --> src/main.rs:30:29
   |
30 |     let gp: GrandParent = c.into().into();
   |                           --^^^^--
   |                           | |
   |                           | cannot infer type for type parameter `T` declared on the trait `Into`
   |                           this method call resolves to `T`
   |
   = note: type must be known at this point

J'ai essayé de spécifier le type à l'aide d'un turbofish, mais cela ne fonctionne pas non plus:

    let c = Child::ChildA;
    let gp: GrandParent = c.into::<Parent>().into();

error[E0107]: wrong number of type arguments: expected 0, found 1
  --> src/main.rs:31:36
   |
31 |     let gp: GrandParent = c.into::<Parent>().into();
   |                                    ^^^^^^ unexpected type argument

Quelle est la bonne façon de chaîner ces appels à into()?

1
Greg Owen 15 oct. 2020 à 23:14

2 réponses

Meilleure réponse
let c: Child = Child::ChildA;
let gp: GrandParent = Into::<Parent>::into(c).into();
2
ephemient 15 oct. 2020 à 20:43

Si vous voulez juste compiler cela, utilisez Into::<TypeToConvertTo>::into(src), mais je suggérerais d'examiner le problème et de savoir si les appels chaînés à into() sont réellement ce que vous voulez (indice: ce n'est probablement pas le cas)

0
MeetTitan 15 oct. 2020 à 20:43