2015-12-08 1 views
1

У меня есть этот код, который использует generics.Почему мой тип FooGen не удовлетворяет привязке свойства RefGen?

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 
     } 
    } 
} 

Интересно, почему Руст говорит мне, что я не могу использовать FooGen для RefGen. Он, безусловно, реализует RefGen.

Точное сообщение об ошибке:

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

Вот манеж: http://is.gd/oBIB1o

+1

Дубликат http://stackoverflow.com/q/32551177/155423 или http://stackoverflow.com/q/31490913/155423 или http://stackoverflow.com/q/31060851/155423 или http://stackoverflow.com/q/33812706/155423 или (вставьте здесь больше результатов поиска). – Shepmaster

ответ

1

Это работает:

impl<R: RefGen> Facade<R> { 
    fn new(gen: R) -> Facade<R> { 
    Facade { 
     gen: gen 
    } 
    } 
} 

Я не уверен в точных терминах, чтобы объяснить это, но здесь он идет: в вашем коде определяется тип Rвнутриnew. Однако Rust требует от вас указать тип от за пределами. Проверьте следующий пример:

// This doesn't typecheck 
fn foo1<T: Clone>() -> T { 
    "hi" 
} 

// This works 
fn foo2<T: Clone>(x: T) -> T { 
    x 
} 

См this answer для более подробного объяснения