Frage

Diese Frage bezieht sich auf das dynamische Hinzufügen von Code zu Kontexten oder Objekten in Rebol 2. Sie bezieht sich auf die Frage Dynamisches Hinzufügen von Wörtern zu einem Kontext in REBOL aber es ist nicht die gleiche Art.

Wenn ich einem Rebol-Objekt mithilfe seines Codeblocks dynamisch Code hinzufügen möchte, habe ich aufgrund eines seltsamen Verhaltens Probleme bekommen:

>> append third o [c: 3]
== [a: 1 b: 2 c: 3]

aber...

>> first o
== [self a b]
>> second o
== [make object! [
        a: 1
        b: 2
    ] 1 2]
>> third o
== [a: 1 b: 2]

der Anhang fehlt!gleiches gilt, wenn angehängt wird an first o oder second o

dies geschieht nicht mit "gemeinsamen" Blöcken:

>> m: [a [b] c]
== [a [b] c]
>> append m 3
== [a [b] c 3]
>> m
== [a [b] c 3]
>> append second m 1
== [b 1]
>> m
== [a [b 1] c 3]

warum ist das so?

War es hilfreich?

Lösung

Der third die Funktion gibt nicht die ursprüngliche Objektspezifikation zurück, sondern einen neuen Block von Mengenwörtern und Werten, die aus den Wörtern und Werten des Objekts generiert werden.Sie hängen also an diesen neuen Block an (was sich auf den Block, aber nicht auf das Objekt auswirkt).

Sie können keinen Serienverweis auf den ursprünglichen Block erhalten, der als Objektspezifikation übergeben wurde.Es wird weggeworfen, nachdem das Objekt erstellt wurde, und es hat sowieso keine weiteren Auswirkungen auf das Objekt.So auch wenn sie hatten einen Verweis auf den Block gespeichert, an den Sie übergeben haben make object, würde das Anhängen daran auch nichts mit dem Objekt zu tun haben.

Sie können Objekte in Rebol 2 einfach nicht anhängen.Aber in Rebol 3 können Sie an Objekte anhängen:

>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
    a: 1
    b: 2
    c: 3
]

(Beachten:Verwenden Sie die Ordinalreflektoren in Rebol 2 nicht.Verwenden words-of statt first, values-of statt second, und body-of statt third.Die Ordinalreflektoren sind seit Rebol 2.7.7, das vor 5 Jahren herauskam, veraltet und wurden in Rebol 3 entfernt.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top