为什么我的FooGen类型不满足RefGen特征限制?

时间:2015-12-08 18:58:48

标签: generics rust

我有这个使用泛型的代码。

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告诉我我不能使用FooGenRefGen。它肯定会实现RefGen

确切的错误消息是:

expected `Facade<R>`,
found `Facade<FooGen>`

这是一个围栏:http://is.gd/oBIB1o

1 个答案:

答案 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