Der ==
Operator steht nicht für strukturelle Gleichheit, sondern für körperliche Gleichheit. In C-artiger Sprache vergleicht es nicht die Werte, sondern die Zeiger. Es ist im Allgemeinen nicht ratsam, sie für nicht veränderbare Werte zu verwenden (es sei denn, Sie führen Memo-Vorgänge durch).
zitieren die OCaml manual:
e1 == e2
Tests für physische Gleichheit von e1
und e2
. Bei veränderlichen Typen wie Referenzen, Arrays, Bytefolgen, Datensätzen mit veränderbaren Feldern und Objekten mit veränderbaren Instanzvariablen ist e1 == e2
genau dann wahr, wenn die physische Änderung von e1
auch Auswirkungen auf e2
hat. Bei nicht veränderbaren Typen ist das Verhalten von (==)
implementierungsabhängig; es ist jedoch garantiert, dass e1 == e2
compare e1 e2 = 0
bedeutet.
Jetzt, wenn Sie versuchen, den Operator =
zu verwenden, der strukturelle Gleichheit prüft.
utop # 1::2::[] = [1;2];;
- : bool = true
Bitte formatieren Sie diesen Code neu. –
Ich weiß nichts über Ocaml, aber mit einem Online-Interpreter bewertete ich das 1 :: 2 :: [] == 1 :: 2 :: [] ;; falsch zurückgeben. Dies lässt mich denken, dass der Operator == testet, wenn die Operanden die gleiche Objektreferenz sind, nicht wenn sie gleich sind. Ich kenne den Okaml-Jargon nicht, ich hoffe es ist klar, was ich meine. – Eineki
Beachten Sie, dass dies für * die meisten * Sprachen gilt, Referenztypen werden fast immer auf Gleichheit durch Zeigervergleich getestet. Es wäre sehr schwierig, die Leistung vorherzusagen, wenn der Standard ein tiefer Vergleich des Containerinhalts wäre. –