Zum Inhalt springen

With-Statement

Ein häufiges Muster bei der Erstellung eines Objekts ist, unmittelbar danach eine Reihe von Funktionen aufzurufen und Eigenschaften zu setzen.

Das führt dazu, dass der Objektname mehrfach wiederholt wird und unnötiges Rauschen entsteht. Eine gängige Lösung ist, eine Tabelle als Argument zu übergeben, die eine Sammlung von Schlüsseln und Werten enthält, die überschrieben werden sollen. Der Nachteil ist, dass der Konstruktor dieses Objekts diese Form unterstützen muss.

Der with-Block hilft, das zu vermeiden. Innerhalb eines with-Blocks können wir spezielle Anweisungen verwenden, die mit . oder \ beginnen und die Operationen auf das Objekt anwenden, mit dem wir gerade arbeiten.

Zum Beispiel arbeiten wir mit einem neu erstellten Objekt:

with Person!
.name = "Oswald"
\add_relative my_dad
\save!
print .name

Das with-Statement kann auch als Ausdruck verwendet werden und gibt den Wert zurück, auf den es Zugriff gewährt.

file = with File "Lieblingsessen.txt"
\set_encoding "utf8"

with-Ausdrücke unterstützen break mit genau einem Wert:

result = with obj
break .value

Sobald break value in with verwendet wird, gibt der with-Ausdruck nicht mehr sein Zielobjekt zurück, sondern den von break gelieferten Wert.

a = with obj
.x = 1
-- a ist obj
b = with obj
break .x
-- b ist .x, nicht obj

Im Unterschied zu for / while / repeat / do unterstützt with nur einen break-Wert.

Oder …

create_person = (name, relatives) ->
with Person!
.name = name
\add_relative relative for relative in *relatives
me = create_person "Leaf", [dad, mother, sister]

In dieser Verwendung kann with als spezielle Form des K-Kombinators gesehen werden.

Der Ausdruck im with-Statement kann auch eine Zuweisung sein, wenn du dem Ausdruck einen Namen geben willst.

with str := "Hallo"
print "Original:", str
print "Großbuchstaben:", \upper!

Du kannst in einem with-Statement über [] auf spezielle Schlüssel zugreifen.

with tb
[1] = 1
print [2]
with [abc]
[3] = [2]\func!
["key-name"] = value
[] = "abc" -- an "tb" anhängen

with? ist eine erweiterte Version der with-Syntax, die einen Existenz-Check einführt, um Objekte, die nil sein könnten, sicher zuzugreifen, ohne explizite Nullprüfungen.

with? obj
print .name

YueScriptCompiler

Compiler wird geladen…