2015-05-25 11 views
5

Ich habe zwei Arten, die auf Gleichheit geprüft werden können. Sobald ich sie jedoch in Options einpacke, geht die von verschiedenen PartialEq Implementierungen zur Verfügung gestellte Genauigkeit direkt aus dem Fenster. Ich muss map verwenden oder sie anderweitig konvertieren.Was ist der idiomatische Weg, um zwei Optionen für die Gleichheit zu testen, wenn sie Werte enthalten, die auf Gleichheit getestet werden können?

Als Beispiel nehmen sie &str verwenden und String:

fn main() { 
    let a = "hello"; 
    let b = "hello".to_owned(); 

    assert_eq!(a, b); // Just fine 

    let a = Some(a); 
    let b = Some(b); 

    // error: mismatched types 
    assert_eq!(a, b); 

    // error: mismatched types 
    assert_eq!(a, b.as_ref()); 

    // works, but highly tied to strings or slices, 
    // requires me to remember which is which 
    assert_eq!(a, b.map(|x| &x[..])); 
} 

Es sicherlich ein einfacherer oder straight-forward Weg, dies zu tun sein muß?

Side-Frage - was verhindert OptionPartialEq ein bisschen breiter implementieren? Ich vermute, Kohärenz, meine alte Nemesis.

impl<T, U> PartialEq<Option<U>> for Option<T> 
where 
    T: PartialEq<U>, 

Es gibt einige Geschwätz über diese in den RFCs und Rust Fragen (1, 2).

Antwort

0

Es scheint keinen technischen Grund zu geben, der dies blockiert, es sieht so aus, als ob es nur eine Frage der Implementierungsarbeit ist.

+0

Ich habe tatsächlich versucht, einen Patch an Rust zu landen, um das hinzuzufügen. Es stellt sich jedoch heraus, dass es nicht einfach ist, dies der Sprache hinzuzufügen, wie sie in Version 1.1 existiert. Eines der Hauptprobleme ist, dass 'None' mehrdeutig wird und Sie * angeben müssen, welche Art von' None' * gemeint ist: 'None :: '. Offensichtlich ist das für die Ergonomie ziemlich schlimm. – Shepmaster

+0

Das ist keine sehr gute Antwort. Wie machen Sie die Gleichheitsprüfung? Mit 'Karte'? –

Verwandte Themen