我刚刚开始摆弄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
。