我真的不明白下面的代码有什么问题。反正不清楚。我过去常常将Toto参数化,但我认为我会给终身推理一个机会。问题似乎是对self的引用。我得到了编译器错误:
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()]);
}
答案 0 :(得分:2)
您需要将您的特质改回:
trait Toto<'a> {
fn klax(&self, &'a [String]) -> &'a [String];
}
As I understand it,如果你一生都没有离开,终生的精神将会产生:
trait Toto<'a> {
fn klax(&'a self, &[String]) -> &'a [String];
}
也就是说,您返回属于对象的String
个片段。但是,您希望结果来自输入,这不是默认规则所给出的。
修改强>
建议更改为
fn klax<'a>(&'a self, slice: &'a [String]) -> &[String]
表示您的对象和输入具有相同的生命周期。结果生命周期也是'a
(通过省略规则),因此返回输入将适合生命周期。如果这对你的情况有意义并且你做了这个改变,你就会得到错误:
method `klax` has an incompatible type for trait: expected concrete lifetime, found bound lifetime parameter
因为现在你的特质和特质的实施不再匹配了。