/ / Automatische automatische Inferenz in Bezug auf die Implementierung von Merkmalen - Rost

Rust automatische Art Rückschluss auf Trait-Implementierung - Rost

Ich verstehe nicht wirklich, was das Problem istMein Code unten. Sowieso nicht eindeutig. Ich habe Toto mit einer Lebenszeit parametrisiert, aber ich dachte, ich würde dem Lebensdauerschluß eine Chance geben. Das Problem scheint mit dem Verweis auf sich selbst zu sein. Ich bekomme den Compiler-Fehler:

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   }

Für den folgenden Code:

#![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()]);
}

Antworten:

2 für die Antwort № 1

Sie müssen Ihr Merkmal wieder ändern in:

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

So wie ich es versteheWenn Sie alle Lebenszeiten aufgeben, wird die Ausscheidung auf Lebenszeit nachgeben:

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

Das heißt, du gibst ein Stück zurück Strings, die zum gehören Objekt. Sie möchten jedoch, dass das Ergebnis aus der Eingang, was nicht die Standardregeln sind.

Bearbeiten

Die vorgeschlagene Änderung in

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

Sagt das dein Objekt und das Eingang habe die gleiche Lebensdauer Das Ergebnis wäre auch eine Lebensdauer "a (nach den Ausnahmeregeln), und so würde die Rückgabe der Eingabe die Lebensdauer entsprechen. Wenn dies für Ihren Fall sinnvoll war und Sie diese Änderung vornehmen sollten, erhalten Sie den Fehler:

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

Weil nun Ihre Eigenschaft und Implementierung dieser Eigenschaft nicht mehr übereinstimmen.