Rust“无法确定此有界类型参数的类型:无约束类型”

时间:2014-08-09 09:06:46

标签: compiler-errors rust

我刚刚开始摆弄Rust,我发现了一个我不理解的错误,试图构建类似DSL的东西。

我已经定义了这样的结构:

struct Thing<T> {
     a: T
}

impl<T: Show> Thing<T> {
   fn selfie<T>(&self) -> Thing<T> { Thing { a: self.a } }
   fn say<T>(&self) { println!("sing") }
}

然后我这样称它并得到错误:

let a = Thing { a: 1i }; // works
a.say(); // works
let s = a.selfie(); //works
s.say(); // error

main.rs:49:5: 49:12 error: cannot determine a type for this bounded type parameter: unconstrained type
main.rs:49     s.say();
               ^~~~~~~

有谁知道这个错误意味着什么?我很难搞清楚,并尝试了几个不同的演员,似乎什么都没有用。

或者,是否有更好的方法可以将引用返回到&#34; self&#34; (这是我真正想要做的&#34; selfie&#34;方法但由于参考寿命而得到错误)或者#34;同等类型的结构&#34;?

1 个答案:

答案 0 :(得分:2)

这会编译最新的Rust版本。

use std::fmt::Show;

struct Thing<T> {
     a: T
}

impl<T: Show + Clone> Thing<T> {
   fn selfie(&self) -> Thing<T> { Thing { a: self.a.clone() } }
   fn say(&self) { println!("sing: {}", self.a) }
}

我假设say方法应该实际打印a(因为否则Show绑定没有意义)。

问题是在say<T>中存在泛型类型T但由于未使用它而无法推断。在自拍方法中,不需要<T>。如果我们想克隆它,我们确实需要将T限制为实现克隆的那些类型。

我还应该指出selfie方法正在重塑clone。你可以这么做:

#[deriving(Clone)]
struct Thing<T> {
     a: T
}

然后拨打clone()而不是selfie