Scala ha ereditato il concetto di uguaglianza universale dalle sue lingue ospitanti. Ricorda, Scala è progettato per essere una lingua ospitata , cioè una lingua che diventa parte dell'ecosistema di un'altra lingua. Ad esempio, Scala.NET (ora abbandonato) sulla piattaforma .NET, Scala-JVM sulla piattaforma Java, Scala.js sulla piattaforma ECMAScript e così via.
Ciò che tutte queste lingue hanno in comune è l'uguaglianza universale:
// ### Java:
String s = "42";
int i = 42;
// ### Value equality:
s.equals(i);
//=> false
// ### Reference equality:
s == i
// error: bad operand types for binary operator '=='
// ### C♯:
var s = "42";
var i = 42;
// ### Value equality:
s.Equals(i);
//=> False
s == i;
// error CS0019: Operator '==' cannot be applied to operands of type 'string' and 'int'
// ### Reference equality:
object.ReferenceEquals(s, i);
//=> False
// ### ECMAScript:
const s = "42";
const i = 42;
// ### Value equality:
s == i;
//=> true
s === i;
//=> false
// ### Scala:
val s = "42"
val i = 42
// ### Value equality:
s == i
//=> false
// ### Reference equality:
s eq i
// error: the result type of an implicit conversion must be more specific than AnyRef
Come puoi vedere, Scala non è il solo a restituire un valore booleano per l'uguaglianza di valore. Java, C♯ (tranne quando si utilizza l'operatore ==
) e ECMAScript si comportano in modo simile. (ECMAScript restituisce anche true
in un caso!)
Lì sono , comunque, persone nella comunità di Scala che pensa intensamente all'uguaglianza . Fortunatamente, non si lamentano solo, ma offrono anche soluzioni, ad esempio Scalaz Equal
typeclass e cats ' Eq
typeclass non sono universali.