Frage

Stellen Sie sich folgende REBOL Code:

foo: context [bar: 3]

Ich habe jetzt einen Kontext foo, in dem 'bar definiert ist. Wie kann ich dynamisch ein neues Wort in diesem Zusammenhang injizieren? Ist es möglich?

Ich habe versucht:

set/any in foo 'baz 3

Aber das funktioniert nicht, weil der Ausdruck in foo 'baz schlägt fehl, weil es kein Wort 'baz im foo Kontext definiert ist.

Ich sollte hinzufügen, dass ich einen Weg erkennen, dies zu tun, ist wie folgt:

foo-prototype: [bar: 3]
foo: context foo-prototype
foo: context head append foo-prototype [baz: 3]

Aber was, wenn Sie keinen Zugriff auf foo Prototyp Block?

War es hilfreich?

Lösung

Sie können das gleiche erreichen, indem das vorhandene Objekt als Prototyp mit einem neuen Objekt zu erstellen.

>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
    bar: 3
    baz: 3
]

Andere Tipps

Es gibt mehrere Möglichkeiten, um die Tatsache zu arbeiten, dass in REBOL / 2 ist es einfach nicht posssible Objekt Kontexten zu erweitern.

Wahrscheinlich können Sie einfach BLOCK verwenden s anstelle von OBJECT s:

>> blobject: [foo 1]
== [foo 1]
>> blobject/bar
** Script Error: Invalid path value: bar
** Near: blobject/bar
>> append blobject [bar 2]
== [foo 1 bar 2]
>> blobject/bar: 3
== 3

Sie können sogar ‚Selbst arbeiten, indem sie nur anhängen das Objekt selbst:

>> insert blobject reduce ['self blobject]
== [[...] foo 1 bar 2]
>> same? blobject blobject/self
== true

Aber wie Sie haben für die Erweiterung OBJECT gefragt! S , Sie für Peter W A Wood Lösung gehen kann einfach um das Objekt zu klonen. Denken Sie daran, dass der resultierende Klon wirklich mit diesem Ansatz eine andere Sache als das ursprüngliche Objekt.

Also, wenn einige Wort gesetzt wurde das Objekt vor dem Klonieren / erstrecken, nach dem Klonen des Objekts, das Wort, um die nicht erweiterten Objekt halten wird noch halten:

>> remember: object: make object! [foo: 1]
>> object: make object [bar: 2]
>> same? remember object
== false
>> probe remember
make object! [
   foo: 1
]

Im Fall ist es wichtig für Sie zu dem Objekt intakt „Referenzen“ zu halten, mögen Sie vielleicht das Objekt, das Sie in einem äußeren Objekt erweitern müssen wickeln, wie in

>> remember: object: make object! [access: make object! [foo: 1]]
>> object/access: make object/access [bar: 2]
>> same? remember object
== true

Sie können dann Safley erweitern das Objekt während gewahrt, da Sie nur speichern Verweise auf den Behälter.

REBOL / 3 wird btw, erlauben Worte OBJECT Zugabe! S.

Diese in REBOL / Core Benutzerhandbuch: „Viele Blöcke enthalten andere Blöcke und Streichern. Wenn ein solcher Block kopiert wird, dessen Unter Serie wird nicht kopiert. Die Sub-Serie sind direkt und bezeichnet die gleiche Reihendaten als Originalblock. "

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