Scala, Java und Gleichheit

7
%Vor%
  

scala & gt; filesHere == filesHere2
  res0: Boolescher Wert = false

Das ist ziemlich gegensätzlich. Ich würde eher erwarten, dass filesHere und filesHere2 gleich sind.

Dies liegt sicherlich an einer Semantikfehlanpassung zwischen Java und Scala, z. B. bezüglich Arrays oder (Datei-) Gleichheit. Klar, mir fehlt hier etwas!

    
acherm 06.08.2010, 09:52
quelle

4 Antworten

4

Vielleicht möchten Sie hier lesen:

Ссылка

Aber es scheint, dass, wenn Sie es getan haben: filesHere.sameElements(filesHere2) , dass es wahr sein sollte.

Das Javadoc dafür ist hier: Ссылка

UPDATE:

Ein paar Schnipsel vom ersten Link, die hilfreich sein können:

In Java, C ++ und C # testet der Operator == als Referenz, nicht die Gleichheit der Werte. Im Gegensatz dazu testet Rubys Operator == auf Wertgleichheit. Unabhängig davon, an welche Sprache Sie gewöhnt sind, sollten Sie daran denken, dass in Scala == auf Wertgleichheit testet.

In Bezug auf == funktioniert nicht wie erwartet auf Listen:

Obwohl dies wie eine Inkonsistenz erscheinen mag, ist es ein konservativer Ansatz seitens der Sprachentwickler, einen expliziten Test der Gleichheit zweier veränderbarer Datenstrukturen zu unterstützen. Auf lange Sicht sollte es Sie vor unerwarteten Ergebnissen in Ihren Bedingungen bewahren.

UPDATE 2:

Basierend auf den Kommentaren von Raphael habe ich mir die Spezifikation angesehen und sie wurde vor zwei Tagen für das neueste Update erstellt, und ich sehe diese unter Ссылка :

%Vor%

Es scheint also, dass sich die Definition in Scala 2.10.2 nicht geändert hat, da die Spezifikation konsistent zu sein scheint. Wenn das Verhalten anders ist, dann sollte es, wenn Sie einen Komponententest schreiben, als ein Fehler für Scala gesendet werden.

    
James Black 06.08.2010, 10:00
quelle
17

Wenn ich über die Welt herrsche, würde ich Scalas Methode eq mit der Begründung ablehnen, dass der Name extrem mit Gleichem und == verwechslungsfähig ist. Stattdessen hat Englisch ein Wort, das Identität im Gegensatz zur Gleichheit ausdrückt: Ich würde es einfach ist nennen.

Ähnlich würde ich Scalas ne ersetzen (was ein schrecklicher Name ist, da es sowohl eine Abkürzung als auch unverständlich ist) mit isnt .

Scheint mir, dass diese zu AnyRef hinzugefügt werden könnten und die alten Methoden sogar in dieser späten Phase veraltet sind.

    
Jonathan 06.08.2010 12:21
quelle
8

Die equals() -Methode von Java-Arrays verwendet die Referenzgleichheit und keine etwas anspruchsvollere Methode. Scala == ist einfach Java equals() .

    
Tom Crockett 06.08.2010 09:59
quelle
8

Der Vergleich funktioniert nicht wie erwartet, da diese Java-API ein Array zurückgibt.

Scalas Arrays und Java-Arrays sind hinter den Kulissen gleich und obwohl das Scala-Array wie eine Klasse aussieht, ist es nur eine java.io.File [] (in diesem Beispiel).

Aus diesem Grund kann die Überprüfung auf Gleichheit nicht außer Kraft gesetzt werden. Scala muss Java-Semantik dafür verwenden.

Betrachten Sie dieses Beispiel:

%Vor%

Dies würde wie erwartet funktionieren.

    
soc 06.08.2010 13:10
quelle

Tags und Links