我有这个使用泛型的代码。
trait RefGen {
fn gen () -> String;
}
struct FooGen;
impl RefGen for FooGen {
fn gen () -> String {
"foo".to_owned()
}
}
struct Facade<R: RefGen> {
gen: R
}
impl<R: RefGen> Facade<R> {
fn new() -> Facade<R> {
Facade {
gen: FooGen
}
}
}
我想知道为什么Rust告诉我我不能使用FooGen
来RefGen
。它肯定会实现RefGen
。
确切的错误消息是:
expected `Facade<R>`,
found `Facade<FooGen>`
这是一个围栏:http://is.gd/oBIB1o
答案 0 :(得分:1)
这有效:
impl<R: RefGen> Facade<R> {
fn new(gen: R) -> Facade<R> {
Facade {
gen: gen
}
}
}
我不确定用于解释此问题的准确术语,但在此处:在您的代码中,类型R
在<{em>} new
函数中确定。但是,Rust要求您提供 outside 函数的类型。请查看以下示例:
// This doesn't typecheck
fn foo1<T: Clone>() -> T {
"hi"
}
// This works
fn foo2<T: Clone>(x: T) -> T {
x
}
有关更详细的说明,请参阅this answer