私はRustのジェネリックの周りに頭を包み込みたい。私は別のWebサイトからHTMLを抽出するためのものを書いています。私は2つの異なるタイプの上にパラメータ化match
返すSpider
秒程度の誤差を取得しています変数は構造体ではなく特性にパラメータ化されていますか?
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
}
:私が欲しいのはこのようなものです。それはSpider<GoogleParser>
を返すことを期待しています。これは、それがパターンマッチの最初の腕の戻り値の型だからです。
spider
はSpider<T: CanGetTitle>
である必要があります。
私はまだこれで苦労しています。それは複数の形質でも機能しますか? 'ParsePage'や' GetQuery'などが必要になり、実装が必要なすべての特性をカバーするために拡張できるものが必要になります。 – jbrown
@jbrownなぜあなたはそれが複数の形質で機能しないと信じていますか? – Shepmaster
チェックしてください。私は錆を学んでいるだけです。 – jbrown