Ich habe zwei Arten, die auf Gleichheit geprüft werden können. Sobald ich sie jedoch in Option
s 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 Option
PartialEq
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).
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
Das ist keine sehr gute Antwort. Wie machen Sie die Gleichheitsprüfung? Mit 'Karte'? –