/ / Ръжда автоматичен тип заключение за изпълнение на черта - ръжда

Автоматично отклонение на ръждата при внедряването на чертата - ръжда

Наистина не разбирам с какво е проблемътмоя код по-долу. Все пак не е ясно. Използвах за параметризиране на 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

Защото сега вашата черта и изпълнението на тази черта вече не съвпадат.