我刚刚开始摆弄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();
               ^~~~~~~

有人知道这个错误是什么意思吗?我很难解决这个问题,并且尝试了几种不同的转换,但似乎没有任何效果。

或者,是否有更好的方法可以返回对“self”的引用(这是我真正想在“selfie”方法中执行的操作,但由于引用生命周期而出现错误)或“相同的等效结构种类”?

最佳答案

这将使用最新的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绑定(bind)没有意义)。

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

我还应该指出selfie方法正在重塑clone。您可以这样做:
#[deriving(Clone)]
struct Thing<T> {
     a: T
}

然后调用clone()而不是selfie

09-03 17:20