我开始了一个新项目,我希望尽可能模块化,我的意思是我希望将来能够用其他部件替换某些部件。这似乎是一个完美的用途traits
,目前我有这个代码:
mod parser;
mod renderer;
mod renderers;
use parser::MarkParser;
use renderer::MarkRenderer;
struct Rustmark <P: MarkParser, R: MarkRenderer> {
parser: P,
renderer: R,
}
impl <P: MarkParser, R: MarkRenderer> Rustmark <P, R> {
fn new() -> Rustmark <P, R> {
Rustmark {
parser: parser::DefaultParser::new(),
renderer: renderers::HTMLRenderer::new(),
}
}
fn render(&self, input: &str) -> &str {
self.renderer.render(self.parser.parse(input))
}
}
但我遇到了一些错误,主要是这个:
error:不匹配的类型:
预期的Rustmark<P, R>
,
成立Rustmark<parser::DefaultParser, renderers::html::HTMLRenderer>
(预期类型参数,
找到结构parser::DefaultParser
) [E0308]
还有一些像这样的终生错误:
error:由于需求冲突,无法推断自动强制的适当生命周期
help:考虑使用显式生命周期参数,如下所示:fn parse<'a>(&'a self, input: &'a str) -> &str
我尝试了多次调整以使其工作,但似乎没有一个能够安抚编译器。所以我想知道这是否是正确的方法以及我可以做些什么来使其发挥作用。
第一个错误:您创建了一个Rustmark
带有字段的对象parser
类型的DefaultParser
和田野renderer
类型的HTMLRenderer
,但该函数预计返回Rustmark <P, R>
。一般来说 P 不是类型DefaultParser
并且 R 不是类型HTMLRenderer
,所以它永远不会编译。如果您想要正确类型的默认值,一个好的解决方案是绑定P
and R
实施Default
trait
, 这边走:
use std::default:Default;
impl <P: MarkParser + Default, R: MarkRenderer + Default> Rustmark <P, R> {
fn new() -> Rustmark <P, R> {
Rustmark {
parser: P::default(),
renderer: R:default(),
}
}
}
第二个错误:主要问题是您返回的引用可能会在render
方法(String
你在内部分配render
方法大概)。编译器告诉您它不知道该引用所指向的对象的生命周期,因此它不能保证该引用是有效的。您可以指定生命周期参数,但在您的情况下,最好的解决方案可能是返回String
对象本身,而不是引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)