Syntax

$orig.copy()

copy(orig: $orig,
	context: $context, 
	filter: $filter, 
	constructor: $constructor, 
	transient: false,
	skipTransactionDefaults: false)

Beschreibung

Erstellt eine tiefe Kopie des Objektes bzw. eine einfache Kopie des Wertes orig.

In einer tiefen Kopie eines Objektes sind alle über Kompositionsreferenzen erreichbare Objekte ebenfalls mitkopiert. Andere Referenzen in dem kopierten Objektgraphen sind auf Objekte in dem neuen Graphen umgesetzt, wenn sie im ursprünglichen Graphen auf ein Objekt zeigten, das bei der Kopieroperation mitkopiert wurde.

Parameter

Name Typ Beschreibung Pflicht Default
orig Zahl/Zeichenkette/Wahrheitswert/Fachobjekt/Menge Das zu kopierende Objekt bzw. der zu kopierende Wert. ja
context Fachobjekt Das Kontext-Objekt, das bei der Anlage der top-level Kopie (von orig) mitgegeben wird. nein null
filter Funktion

Entscheidet, ob eine bestimmte Eigenschaft aus dem Ursprungsgraphen mitkopiert werden soll. Die Filter-Funktion erhält drei Argumente.

  • Das zu kopierende Attribut.
  • Der zu kopierende Wert.
  • Das zu kopierende Objekt aus dem Ursprungsgraphen.

Ist die Entscheidung true, so wird das Attribut vom Ursprungsobjekt in das Zielobjekt kopiert. Ist das Attribut eine primitive Eigenschaft, wird der Wert direkt in das Zielobjekt übernommen. Ist das Attribut eine Referenz, wird diese Referenz entweder direkt übernommen, oder in den Zielgraphen umgeschrieben, je nachdem, ob das Ursprungsobjekt in der Kopieroperation kopiert wurde oder nicht. Ist das Attribut eine Komposition, wird eine tiefe Kopie des Ursprungsobjektes angefertigt.

Ist die Entscheidung false, so bleibt das Attribut im Zielobjekt uninitialisiert. In diesem Fall, könnte die Konstruktorfunktion für dieses Attribut einen Standardwert ausrechnen und zusammen mit der Konstruktion setzen.

nein attribute -> orig -> context -> true
constructor Funktion

Eine Funktion, die ein Objekt aus dem Ursprungsgraphen nimmt und eine (uninitialisierte) Kopie dieses Objektes zurückliefert. Die Funktion erhält drei Argumente:

  • Das zu kopierende Originalobjekt.
  • Die Referenz, über die das Originalobjekt mit seinem Kontext verknüpft ist (null, für das top-level Objekt).
  • Das originale Kontext-Objekt, das das zu kopierende Originalobjekt in der Kontext-Referenz enthält.

Liefert die Konstruktorfunktion null, wird ein Objekt vom selben Typ wie das Original angelegt.

nein orig -> reference -> context -> null

transient

Boolean Ob die Kopie ein transientes Objekt anlegen soll. Diese Option ist nur relevant, wenn keine Konstrukturfunktion angegeben ist. Wenn nichts angegeben ist (null), werden transiente Objekte als transiente und persistente als persistente kopiert. Transiente Objekte sind nur lokal in der Session des Benutzers sichtbar und können nicht in die Referenz eines persistenten Objektes gespeichert werden. Umgekehrt kann aber ein transientes Objekt in seinen Referenzen normale persistente Objekte referenzieren. nein null
skipTransactionDefaults Boolean Ob eine persistente Kopie die Standardwerte behält, die in der Transaktion ihrer Erzeugung berechnet werden (z.B. eine laufende Nummer oder der Standardwert eines Ausdrucks, der in der Transaktion ausgewertet wird), statt den Wert des Originals zu übernehmen. Mit true werden solche Attribute nicht kopiert, unabhängig vom filter. Ein transientes Objekt erhält solche Standardwerte nie, deshalb ist diese Option nötig, um einen transienten Entwurf zu speichern, ohne sie zu verlieren. Eine transiente Kopie übernimmt in jedem Fall den Wert des Originals. nein false

Rückgabewert

Typ: Zahl/Zeichenkette/Wahrheitswert/Fachobjekt/Menge

In Abhängigkeit vom Typen von x wird folgendes von der Funktion zurückgeliefert:

Beispiele

Objektkopie

{
   a = new(`my.module:MyClass`);
   $a.set(`my.module:MyClass#name`, "orig");
   b = $a.copy();
   $b.set(`my.module:MyClass#name`, "copy");
   list($a, $b);
}

Ausgabe: Gibt eine Liste mit dem originalen und dem kopierten Objekt aus: [orig, copy]

Objektlistenkopie

{
   a = new(`my.module:MyClass`);
   b = new(`my.module:MyClass`);
   list = list($a, $b);
   $list.copy();
}

Ausgabe: Eine Liste mit Kopien der Objekte a und b.

Wertekopie

{
   a = 5;
   b = $a.copy();
   list($a, $b);
}

Ausgabe: Eine Liste mit den Werten [5, 5] - ein Mal die originale Zahl und ein Mal die kopierte.

Entwurf speichern

{
   draft = new(`my.module:Ticket`, transient: true);
   $draft.set(`my.module:Ticket#title`, "Drucker defekt");
   $draft.copy(context: $p, transient: false, skipTransactionDefaults: true);
}

Ausgabe: Ein persistentes Ticket im Kontext p mit dem Titel des Entwurfs, z.B. wie er in einem Anlegedialog bearbeitet wurde. Ein Attribut mit einer laufenden Nummer als Standardwert erhält die nächste Nummer der Sequenz, obwohl der transiente Entwurf keine Nummer hat.