Наистина не разбирам с какво е проблемътмоя код по-долу. Все пак не е ясно. Използвах за параметризиране на Toto с цял живот, но си помислих, че ще дам извадка от живота си на изстрел.
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 }
За следния код:
#![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()]);
}
Отговори:
2 за отговор № 1Ще трябва да промените характеристиката си обратно на:
trait Toto<"a> {
fn klax(&self, &"a [String]) -> &"a [String];
}
Както разбирам, ако престанете да живеете през цялото време на живота си, ще получите доживотна елизия:
trait Toto<"a> {
fn klax(&"a self, &[String]) -> &"a [String];
}
Това означава, че вие връщате парче от String
, които принадлежат на обект, Въпреки това, искате резултатът да дойде от вход, което не е това, което правилата по подразбиране ще дадат.
редактиране
Предложената промяна на
fn klax<"a>(&"a self, slice: &"a [String]) -> &[String]
Казва, че си обект и вход имат еднакъв живот. Ще бъде и резултатът от живота "a
(по правилата на elision), така че връщането на входа ще отговаря на живота. Ако това има смисъл за случая ви и трябва да направите тази промяна, ще получите грешката:
method `klax` has an incompatible type for trait: expected concrete lifetime, found bound lifetime parameter
Защото сега вашата черта и изпълнението на тази черта вече не съвпадат.