Recentemente ho avuto bisogno di creare strutture dati leggermente complesse e ho iniziato a giocare un po 'di più con gli array associativi. Questi sono simili ai dizionari in altre lingue. Dove differiscono è che la maggior parte delle lingue per migliorare la velocità, quando si assegna un oggetto in un dizionario a una variabile fa un binding di dati. In sostanza, fa sì che sia il dizionario sia la variabile si riferiscano allo stesso blocco di memoria e qualsiasi modifica a uno influisca sull'altro. Tuttavia, JMP non lo fa. Di seguito è riportato un codice di esempio per aiutare a spiegare di cosa sto parlando.
testAA = Associative Array(
{
{"test1", Associative Array(
{{"data", {"data1", "data2"}}}
)},
{"test2", Associative Array(
{{"data", {"data1", "data2"}}}
)}
}
);
//create new object
AA = testAA["test1"];
//adding data to AA doesn't add data to testAA
AA["newData"] = "newData";
//you can see AA is a new object
print(AA, testAA);
//Work around to ensure data structures are in sync
testAA["test1"] = AA;
print(AA, testAA);
Non penso che il linguaggio JSL vorrebbe questo comportamento come predefinito. Dico questo, b / c questo può essere fonte di confusione per molti nuovi programmatori e JSL ha in particolare molti entusiasti non programmatori. Tuttavia, questa logica viene applicata alle tabelle dati. AKA:
test = New Table("Hello");
test2 = test;
test << New Column("NewColumn");
print(test2 << Get Column Names);
Penso che sarebbe davvero bello se ci fosse un altro operatore di assegnazione che farebbe riferimenti a oggetti di dati, se necessario. In questo modo ho potuto scegliere se voglio un nuovo oggetto o un riferimento all'altro. Sarei interessato ad altre riflessioni sull'argomento. Inoltre, potrei sbagliarmi completamente e potrebbe esserci un modo per hackerare gli array associativi per fare ciò che non ho ancora trovato.
Grazie!