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 № 1Sie 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 String
s, 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.