特征实现的Rust自动类型推断

时间:2014-12-08 02:00:37

标签: rust

我真的不明白下面的代码有什么问题。反正不清楚。我过去常常将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()]);
}

1 个答案:

答案 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

因为现在你的特质和特质的实施不再匹配了。