/ / Inférence de type automatique sur l'application du trait - rouille

Inférence de type automatique sur la rouille sur la mise en œuvre du trait - rouille

Je ne comprends pas vraiment quel est le problème avecmon code ci-dessous. Pas clairement quand même. J'avais l'habitude de paramétrer Toto avec une durée de vie, mais je me suis dit que je "donnerais une inférence de durée de vie. Le problème semble être avec la référence à self.J'obtiens l'erreur du compilateur:

embedded_lifetimes.rs:11:5: 11:10 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements
embedded_lifetimes.rs:11     slice
^~~~~
embedded_lifetimes.rs:10:3: 12:4 help: consider using an explicit lifetime parameter as shown: fn klax<"a>(&"a self, slice: &"a [String]) -> &[String]
embedded_lifetimes.rs:10   fn klax(&self, slice: &[String]) -> &[String] {
embedded_lifetimes.rs:11     slice
embedded_lifetimes.rs:12   }

Pour le code suivant:

#![feature(slicing_syntax)]

trait Toto {
fn klax(&self, &[String]) -> &[String];
}

struct Tata;

impl Toto for Tata {
fn klax(&self, slice: &[String]) -> &[String] {
slice
}
}

fn main() {
let t = Tata;
t.klax(&["myello".to_string()]);
}

Réponses:

2 pour la réponse № 1

Vous devrez changer votre trait en:

trait Toto<"a> {
fn klax(&self, &"a [String]) -> &"a [String];
}

Si je comprends bien, si vous laissez de côté toutes les durées de vie, l’élision à vie donnera:

trait Toto<"a> {
fn klax(&"a self, &[String]) -> &"a [String];
}

C'est-à-dire que vous retournez une tranche de Strings qui appartiennent à la objet. Cependant, vous voulez que le résultat vienne du contribution, ce qui n’est pas ce que donneront les règles par défaut.

modifier

Le changement suggéré à

fn klax<"a>(&"a self, slice: &"a [String]) -> &[String]

Dit que votre objet et le contribution avoir la même vie. La durée de vie du résultat serait également "a (par les règles d'élision), et donc retourner l'entrée entrerait dans la durée de vie. Si cela avait du sens pour votre cas et que vous deviez apporter ce changement, vous obtiendrez l’erreur suivante:

method `klax` has an incompatible type for trait: expected concrete lifetime, found bound lifetime parameter

Parce que maintenant, votre trait et la mise en œuvre de ce trait ne correspondent plus.