Objekte sind ein wesentlicher Bestandteil der 4D Sprache und von Qodly geworden.
Aber wenn Sie eine Variable dieses Typs deklarieren, definieren Sie eine Referenz. Woher wissen Sie also, ob zwei Objekte tatsächlich ein und dasselbe sind und dieselbe Referenz haben?
Ab 4D 20 R6 ist der Vergleich von Objektreferenzen ganz einfach: Geben Sie die Operatoren = und # ein!
Dieser Blog-Beitrag beschäftigt sich mit diesen Operatoren und wie sie dabei helfen, festzustellen, ob Objekte denselben Bezug haben. Finden Sie mehr heraus!
Gleich, verschieden…
Wenn man über Objekte spricht, ist es wichtig, zwischen ihrem Inhalt und ihrer Referenz zu unterscheiden. Der Vergleich mit gleich (=) und nicht gleich (#) sowie andere Möglichkeiten wie das Suchen und Zählen in Arrays usw. betreffen Referenzen.
Das Gleiche gilt für Sammlungen. Wenn eine Sammlung als Variable deklariert wird, handelt es sich eigentlich um eine Referenz, die deklariert wird. Die folgenden Beispiele sollen dies verdeutlichen.
Bsp. 1: Zwei Objekte werden deklariert und teilen sich dieselbe Referenz.
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
Bsp. 2: Zwei Sammlungen werden deklariert und teilen sich dieselbe Referenz.
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
Beispiel 3: Diesmal haben zwei Objekte und zwei Sammlungen denselben Inhalt. In beiden Fällen handelt es sich um zwei verschiedene Objekte und zwei verschiedene Sammlungen!
$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 und Array-Funktionen
Find in array und Count in array.
Bis jetzt konnten Funktionen wie Find in array und Count in array nicht mit Arrays von Objekten verwendet werden. Jetzt können sie es!
$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
Array sortieren, in sortiertem Array suchen und Array multisortieren
Wenn Ihre Objekt-Arrays viele Elemente enthalten und diese sortiert sind, wird der Befehl Find in sorted array viel schneller sein als Find in the array. Deshalb haben wir auch den Befehl SORT ARRAY verbessert, so dass er auch Objekte sortieren kann! Die Sortierreihenfolge ist eine rein technische interne Reihenfolge, aber sie ist wichtig, damit der ergänzende Befehl Find in sorted array später verwendet werden kann.
Objekte und Sammlungen innerhalb von Sammlungen
Die Funktion query() kann auch verwendet werden, um nach Objekt- oder Sammlungsreferenzen zu suchen… innerhalb einer Sammlung!
Die folgenden Code-Beispiele sind nun gültig.
Zum Beispiel, ein Objekt innerhalb einer Sammlung
$o1:={a: 1}
$c1:=[{o: $o1}]
$c2:=$c1.query("o = :v"; {parameters: {v: $o1}})
Beispiel mit einer Sammlung innerhalb einer Sammlung
$col1:=[1; 2; 3]
$c1:=[{c: $col1}]
$c2:=$c1.query("c = :v"; {parameters: {v: $col1}})
Entitäten und Entitätsselektionen
Nach den ORDA-Prinzipien gilt das Gleiche für Entitäten und Entitätsselektionen. Selbst wenn eine Entität ein Datenbankelement referenziert, ist eine andere Entität, die das gleiche Element referenziert, unterschiedlich (nicht gleich).
$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
Das Gleiche gilt für zwei Entitätsselektionen. Dieser Fall ist vielleicht einfacher zu verstehen. Im zweiten Fall könnte sich in der Zeitspanne zwischen der Erstellung von $es1 und $es2 der Inhalt der Tabelle geändert haben. Aber selbst wenn das nicht der Fall ist, werden $es1 und $es2 immer unterschiedliche Entitätsselektionen sein!
$es1:=ds.T1.all()
$es2:=$es1
$result:=($es1=$es2) // True
$es1:=ds.T1.all()
$es2:=ds.T1.all()
$result:=($es1=$es2) // False
Schlussfolgerung
Sie haben nun die gleichen Möglichkeiten für den Vergleich und die Suche nach Objekten wie bei Strings, Zahlen, Datums- und Zeitangaben. Wir hoffen, dass diese Änderungen zur Anpassung an die anderen Variablentypen Ihre Entwicklung erleichtern werden.
Zögern Sie nicht, uns Ihre Meinung im Forum mitzuteilen!