我试图围绕Rust的泛型来包裹我的头。我正在写点东西来从不同的网站提取HTML。我想是这样的:通过特性变量参数不是结构?
trait CanGetTitle {
fn get_title(&self) -> String;
}
struct Spider<T: CanGetTitle> {
pub parser: T
}
struct GoogleParser;
impl CanGetTitle for GoogleParser {
fn get_title(&self) -> String {
"title from H1".to_string().clone()
}
}
struct YahooParser;
impl CanGetTitle for YahooParser {
fn get_title(&self) -> String {
"title from H2".to_string().clone()
}
}
enum SiteName {
Google,
Yahoo,
}
impl SiteName {
fn from_url(url: &str) -> SiteName {
SiteName::Google
}
}
fn main() {
let url = "http://www.google.com";
let site_name = SiteName::from_url(&url);
let spider: Spider<_> = match site_name {
Google => Spider { parser: GoogleParser },
Yahoo => Spider { parser: YahooParser }
};
spider.parser.get_title(); // fails
}
我得到一个错误有关参数化了两种不同类型的match
返回Spider
秒。它期望它返回Spider<GoogleParser>
,因为这是模式匹配的第一部分的返回类型。
我该如何声明spider
应该是任何Spider<T: CanGetTitle>
?
我还在为此而苦苦挣扎。它会和多种特质一起工作吗?我需要'ParsePage','GetQuery'等东西,并且需要我可以扩展的东西来涵盖所有需要实现的特性。 – jbrown
@jbrown你为什么相信它不会适用于多种特质? – Shepmaster
只是检查。我只是在学习生锈。 – jbrown