2017-12-13 4 views
0

Ich habe Schwierigkeiten zu simulieren Methode überladen mit Merkmalen in Rust, wo es mehrere Arten beteiligt sind.Überladen Sie eine Methode mit Traits

In C++ würde ich

struct PdlDict { 
    void update(const string&,const string&, double x) {...} 
    void update(const string&,const string&, const string x) {...} 
}; 

schreiben und nennen es

PdlDict d; 
d.update(123.0); 
d.update("foo"); 

In Rust für dieses PdlDict struct

pub struct PdlDict { 
    pub pdl_items: Vec<PdlItem>, 
} 
impl PdlDict { 
    fn new() -> PdlDict { 
     PdlDict { 
      pdl_items: Vec::new(), 
     } 
    } 
} 

ich dieses Merkmal implementiert, die

arbeitet 10

Berufung fühlt sich nicht ergonomisch wie ich das Objekt zu übergeben, die als erstes Argument aktualisieren mögen:

"bar".update(&pdl, "r", "result"); 
64.0.update(&pdl, "r", "result"); 

Was die eine angemessenere Art und Weise ist die gleiche Semantik in einer idiomatischen Rust Art und Weise zu erreichen, ?

Ich vermute, es ist eine Kombination von Eigenschaften und Vorlagen, aber ich kann nicht denken, wie man sich nähert.

Bearbeiten Beachten Sie, dass diese Frage nicht fragt, wie die Vererbung mithilfe von Merkmalen implementiert wird. Ich habe das bereits in diesem Beispiel getan und es funktioniert gut. Es fragt nach einer Art und Weise, in einem Stil über

Antwort

1

IMO als gegeben Erbe ausdrückt, die idiomatische Weise wie etwas schreiben würde, was du getan hast, und dann die Ergonomie hinzufügen mit:

impl PdlDict { 
    fn update<T: UpdatePdl>(&self, object_name: &str, name: &str, t: T) { 
     t.update(&self, object_name, name) 
    } 
}