Generics 防锈仿制药:预期<;T>;找到<;Foo>;

Generics 防锈仿制药:预期<;T>;找到<;Foo>;,generics,rust,traits,Generics,Rust,Traits,我试图使用泛型,但我对该主题掌握得不够好,因此出现以下错误: error: mismatched types: expected `book::mdbook::MDBook<R>`, found `book::mdbook::MDBook<renderer::html_handlebars::HtmlHandlebars>` (expected type parameter, found struct `renderer::html_handlebars::HtmlHan

我试图使用泛型,但我对该主题掌握得不够好,因此出现以下错误:

error: mismatched types:
expected `book::mdbook::MDBook<R>`,
found `book::mdbook::MDBook<renderer::html_handlebars::HtmlHandlebars>`
(expected type parameter,
found struct `renderer::html_handlebars::HtmlHandlebars`) [E0308]
我做错了什么

impl<R> MDBook<R> where R: Renderer {

    pub fn new(path: &PathBuf) -> Self {
那么泛型对于这项工作来说是错误的工具,因为它们将渲染器的选择作为
book
的静态类型的一部分。您可以完全删除
R
类型参数,保留您的特征,只需在
MDBook
中存储一个(可能是


那么泛型对于这项工作来说是错误的工具,因为它们将渲染器的选择作为
book
的静态类型的一部分。您可以完全删除
R
类型参数,保留您的特征,只需在
MDBook

中存储一个(可能是
)顺便说一句,
&PathBuf
&String
一样无用。您需要
&Path
(道德上等同于
&str
)。好的,谢谢!我不知道:)顺便说一下,
&PathBuf
&String
一样无用。您需要
&Path
(道德上等同于
&str
)。好的,谢谢!我不知道:)我希望
new
始终返回
MDBook
,因为它是默认的渲染器。我应该将返回值从
Self
更改为
MDBook
吗?实际上,我想要实现的是能够将渲染器换成另一个渲染器。而性格似乎是最好的方法。。。这是个好主意还是有更好的方法?@MathieuDavid您可以有一个返回
MDBook
的方法,尽管将其放入
impl MDBook{}
块更合适。但是,如果您没有其他一些方法可用于所有
R
MDBook
,那么泛型是没有意义的。而且名称必须不同,因为这里没有重载。也许你会问自己为什么要为这个默认设置一个特例。@MathieuDavid如果你想拥有一个
MDBook
对象并动态更改它使用的渲染器,那么泛型是错误的工具(尽管traits也适用)。我对答案进行了编辑,也涵盖了这一点。非常感谢您,使用
Box
效果非常好。我希望
new
始终返回
MDBook
,因为它是默认的渲染器。我应该将返回值从
Self
更改为
MDBook
吗?实际上,我想要实现的是能够将渲染器换成另一个渲染器。而性格似乎是最好的方法。。。这是个好主意还是有更好的方法?@MathieuDavid您可以有一个返回
MDBook
的方法,尽管将其放入
impl MDBook{}
块更合适。但是,如果您没有其他一些方法可用于所有
R
MDBook
,那么泛型是没有意义的。而且名称必须不同,因为这里没有重载。也许你会问自己为什么要为这个默认设置一个特例。@MathieuDavid如果你想拥有一个
MDBook
对象并动态更改它使用的渲染器,那么泛型是错误的工具(尽管traits也适用)。我也编辑了答案来涵盖这一点。非常感谢您,使用
Box
效果非常好。
let book = MDBook::new(path);
if some_condition {
    book.set_renderer(SomeOtherThing::new());
}