我刚刚开始摆弄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;?
答案 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
。