Ich versuche, Rust Generika um den Kopf zu wickeln. Ich schreibe etwas, um HTML von verschiedenen Websites zu extrahieren. Was ich will, ist so etwas wie dieses:Variable über ein Merkmal parametrisiert keine Struktur?
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
}
Ich erhalte eine Fehlermeldung über den match
Rückkehr Spider
s über zwei verschiedene Arten parametriert. Es erwartet, dass es Spider<GoogleParser>
zurückgibt, weil das der Rückgabetyp des ersten Arms der Musterübereinstimmung ist.
Wie kann ich erklären, dass spider
eine Spider<T: CanGetTitle>
sein sollte?
Ich kämpfe immer noch mit diesem. Wird es mit mehreren Eigenschaften arbeiten? Ich brauche Dinge wie 'ParsePage',' GetQuery' usw. und benötige etwas, das ich erweitern kann, um alle Eigenschaften abzudecken, die implementiert werden müssen. – jbrown
@jbrown Warum glaubst du, dass es nicht mit mehreren Eigenschaften funktioniert? – Shepmaster
nur überprüfen. Ich lerne nur Rost. – jbrown