Gli oggetti sono diventati una parte essenziale del linguaggio 4D e di Qodly.
Ma quando si dichiara una variabile di questo tipo, si definisce un riferimento. Come si fa a sapere se due oggetti sono in realtà uno solo e condividono lo stesso riferimento?
A partire da 4D 20 R6, confrontare i riferimenti di un oggetto è semplice: si tratta degli operatori = e #!
Questo post esplora questi operatori e come aiutano a determinare se gli oggetti condividono lo stesso riferimento. Scopriamone di più!
Uguale, diverso…
Quando si parla di oggetti, è essenziale distinguere tra il loro contenuto e il loro riferimento. Il confronto con gli operatori di uguaglianza (=) e non uguaglianza (#), così come altre possibilità come la ricerca e il conteggio negli array, ecc. riguardano i riferimenti.
Lo stesso vale per le collezioni. Quando una collezione viene dichiarata come variabile, in realtà viene dichiarato un riferimento. Gli esempi che seguono aiutano a chiarire questo punto.
Es1: Due oggetti sono dichiarati e condividono lo stesso riferimento.
var $o1; $o2 : Object
$o1:={a: 1}
$o2:=$o1 // Same reference, $o2 is NOT a copy of $o1
$result:=($o1=$o2) // True
$result:=($o1#$o2) // False
Es2: Due collezioni sono dichiarate e condividono lo stesso riferimento.
var $c1; $c2 : Collection
$c1:=["a"]
$c2:=$c1 // Same reference, $c2 is NOT a copy of $c1
$result:=($c1=$c2) // True
$result:=($c1#$c2) // False
Ex3: Questa volta, due oggetti e due collezioni hanno lo stesso contenuto. In entrambi i casi, si tratta di due oggetti e due collezioni distinti!
$o1:={a: 1}
$o2={a: 1}
$result:=($o1=$o2) // False (objects are distinct!)
$result:=($o1#$o2) // True
$c1:=["a"]
$c2:=["a"]
$result:=($c1=$c2) // False (collections are distinct!)
$result:=($c1#$c2) // True
Array e funzioni di array
Find in array e Count in array.
Finora, funzioni come Find in array e Count in array non potevano essere utilizzate con gli array di oggetti. Ora è possibile!
$o1:={a: 1}
$objects{20}:=$o1
$position:=Find in array($objects; $o1) // returns20 !
$o1:={a: 1}
$objects{10}:=$o1
$objects{20}:=$o1
$objects{30}:=$o1
$count:=Count in array($objects; $o1) // -> Returns 3
Ordinamento di array, ricerca in array ordinati e array multiordinati
Se gli array di oggetti contengono molti elementi e sono ordinati, il comando Find in sorted array sarà molto più veloce di Find in the array. Ecco perché abbiamo migliorato anche il comando SORT ARRAY in modo che possa ordinare gli oggetti! L’ordinamento è un ordine interno puramente tecnico, ma è essenziale per consentire l’uso del comando complementare Find in sorted array in seguito.
Oggetti e collezioni all’interno di collezioni
La funzione query() può essere utilizzata anche per cercare riferimenti a oggetti o collezioni… all’interno di una collezione!
Gli esempi di codice riportati di seguito sono ora validi.
Ad esempio, un oggetto all’interno di un insieme
$o1:={a: 1}
$c1:=[{o: $o1}]
$c2:=$c1.query("o = :v"; {parameters: {v: $o1}})
Esempio con una collezione all’interno di una collezione
$col1:=[1; 2; 3]
$c1:=[{c: $col1}]
$c2:=$c1.query("c = :v"; {parameters: {v: $col1}})
Entità e selezioni di entità
Secondo i principi ORDA, lo stesso vale per le entità e le selezioni di entità. Anche se un’entità fa riferimento a un elemento del database, un’altra entità che fa riferimento allo stesso elemento sarà comunque diversa (non uguale).
$e1:=ds.Table.all().first()
$e2:=$e1
$result:=($e1=$e2) // True
$e1:=ds.Table.all().first()
$e2:=ds.Table.all().first()
$result:=($e1=$e2) // False
Lo stesso vale per due selezioni di entità. Questo potrebbe essere più facile da capire. Nel secondo caso, nel lasso di tempo che intercorre tra la creazione di $es1 e $es2, il contenuto della tabella potrebbe essere cambiato. Ma anche se non fosse così, $es1 e $es2 saranno sempre selezioni di entità distinte!
$es1:=ds.T1.all()
$es2:=$es1
$result:=($es1=$es2) // True
$es1:=ds.T1.all()
$es2:=ds.T1.all()
$result:=($es1=$es2) // False
Conclusione
Ora si hanno le stesse possibilità di confronto e ricerca di oggetti che si hanno con stringhe, numeri, date e orari. Ci auguriamo che queste modifiche per conformarsi agli altri tipi di variabili facilitino il vostro sviluppo.
Non esitate a farci sapere cosa ne pensate sul forum!