Los objetos se han convertido en una parte esencial del lenguaje 4D y de Qodly.
Pero cuando se declara una variable de este tipo, se define una referencia. Entonces ¿cómo saber si dos objetos son, de hecho, uno solo y comparten la misma referencia?
A partir de 4D 20 R6, comparar referencias de objetos es sencillo: ¡introduzca los operadores = y #!
Esta entrada del blog explora estos operadores y cómo ayudan a determinar si los objetos comparten la misma referencia. Averigüemos más.
Iguales, diferentes…
Cuando hablamos de objetos, es esencial distinguir entre su contenido y su referencia. La comparación mediante iguales (=) y no iguales (#), así como otras posibilidades como la búsqueda y el recuento en arrays, etc., se refieren a referencias.
Lo mismo ocurre con las colecciones. Cuando se declara una colección como variable, en realidad se declara una referencia. Los ejemplos siguientes le ayudarán a aclararlo.
Ej1: Se declaran dos objetos que comparten la misma referencia.
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
Ej2: Se declaran dos colecciones y comparten la misma referencia.
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
Ej3: Esta vez, dos objetos y dos colecciones tienen el mismo contenido. En ambos casos, se trata de dos objetos y dos colecciones distintos.
$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
arrays y funciones arrays
Find in array y Count in array.
Hasta ahora, funciones como Find in array y Count in array no podían utilizarse con arrays de objetos. Ahora sí.
$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
Ordenar ARRAYS, buscar en ARRAYS ordenadOs y multiordenar ARRAYS
Si sus arrays de objetos contienen muchos elementos y éstos están ordenados, el comando Find in sorted array será mucho más rápido que Find in the array. Por eso también hemos mejorado el comando SORT ARRAY para que también pueda ordenar objetos. El orden de clasificación es un orden interno puramente técnico, pero es esencial para poder utilizar más adelante el comando complementario Find in sorted array.
Objetos y colecciones dentro de colecciones
La función query() también puede utilizarse para buscar referencias a objetos o colecciones… ¡dentro de una colección!
Los ejemplos de código que figuran a continuación son ahora válidos.
Por ejemplo, un objeto dentro de una colección
$o1:={a: 1}
$c1:=[{o: $o1}]
$c2:=$c1.query("o = :v"; {parameters: {v: $o1}})
Ejemplo con una colección dentro de una colección
$col1:=[1; 2; 3]
$c1:=[{c: $col1}]
$c2:=$c1.query("c = :v"; {parameters: {v: $col1}})
Entidades y selecciones de entidades
Según los principios de ORDA, lo mismo se aplica a las entidades y a las selecciones de entidades. Aunque una entidad haga referencia a un elemento de la base de datos, otra entidad que haga referencia al mismo elemento seguirá siendo diferente (no igual).
$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 mismo se aplica a dos selecciones de entidades. Esto puede ser más fácil de entender. En el segundo caso, en los lapsos de tiempo entre que se crean $es1 y $es2, el contenido de la tabla puede haber cambiado. Pero incluso si no es el caso, ¡$es1 y $es2 siempre serán selecciones de entidades distintas!
$es1:=ds.T1.all()
$es2:=$es1
$result:=($es1=$es2) // True
$es1:=ds.T1.all()
$es2:=ds.T1.all()
$result:=($es1=$es2) // False
Conclusión
Ahora tiene las mismas posibilidades para comparar y buscar objetos que tenía con cadenas, números, fechas y horas. Esperamos que estos cambios para ajustarse a los demás tipos de variables le faciliten el desarrollo.
No dudes en hacernos llegar su opinión en el foro.