Ho trascorso un po 'del mio tempo libero lavorando una serie di raccolte per ActionScript 3 ma ho raggiunto un roadblock piuttosto serio grazie al modo in cui ActionScript 3 gestisce controlli di uguaglianza all'interno degli oggetti del dizionario.Creazione di un'implementazione "vera" di HashMap con Object Equality in ActionScript 3
Quando si confronta una chiave in un dizionario, ActionScript utilizza l'operatore === per eseguire il confronto, questo ha un effetto collaterale un po 'sgradevole in base al quale solo i riferimenti alla stessa istanza risolveranno true e non gli oggetti di uguaglianza. Ecco cosa voglio dire:
const jonny1 : Person = new Person("jonny", 26);
const jonny2 : Person = new Person("jonny", 26);
const table : Dictionary = new Dictionary();
table[jonny1] = "That's me";
trace(table[jonny1]) // traces: "That's me"
trace(table[jonny2]) // traces: undefined.
Il modo in cui sto cercando di combattere questo è quello di fornire un'interfaccia equalizzatore che assomiglia a questo:
public interface Equalizer
{
function equals(object : Object) : Boolean;
}
Questo permette di eseguire un instanceof-Esq. controlla ogni volta che ho bisogno di eseguire un'operazione di uguaglianza all'interno delle mie raccolte (ricadendo sull'operatore === quando l'oggetto non implementa Equalizer); tuttavia, ciò non aggira il fatto che la mia infrastruttura sottostante (l'oggetto dizionario) non ne sia a conoscenza.
Il modo in cui sto attualmente lavorando attorno al problema è iterando attraverso tutte le chiavi del dizionario ed eseguendo il controllo di uguaglianza ogni volta che eseguo un'operazione containsKey() o get() - tuttavia, questo praticamente sconfigge l'intero punto di una hashmap (operazioni di ricerca a basso costo).
Se non riesco a continuare a utilizzare un'istanza di dizionario come supporto per la mappa, come dovrei fare per creare gli hash per le istanze di oggetto univoche passate come chiavi in modo da poter mantenere l'uguaglianza?