Date un'occhiata a questo semplice classe Sto costruendo la base per memorizzare i risultati degli algoritmi di stringa corrispondente:Perché questi oggetti non sono uguali per impostazione predefinita in D?
/** Match of a single pattern in full to a single text. */
class Match {
uint Tpos;
this(in uint Tpos) { this.Tpos = Tpos; }
override string toString() {
return text("Match: [email protected]",Tpos);
}
}
Qui è dove le cose si fanno strane:
auto m1 = new Match(1), m2 = new Match(1);
writeln(m1.toHash());
writeln(m2.toHash());
writeln(m1 == m2);
stampe
4464528
4464512
false
Non vedo alcun motivo per cui questi due oggetti non dovrebbero essere considerati uguali per impostazione predefinita. Suppongo di poter scrivere una funzione personalizzata toHash()
e opEquals()
, ma sembra eccessivo. Secondo Andrei Alexandrescu book sul linguaggio di programmazione D (ottimo libro!), "Per impostazione predefinita, l'hash viene calcolato utilizzando la rappresentazione bit a bit dell'oggetto." Qualche idea là fuori?
Grazie per il codice sorgente e approfondimenti. Non ho realizzato == rispetto all'identità per impostazione predefinita. Ho finito per riscriverlo come una struct in ogni caso, perché voglio copiare l'oggetto per valore la maggior parte del tempo. – denine99