7

想象一下下面的 REBOL 代码:

foo: 上下文 [bar: 3]

我现在有一个定义的上下文foo'bar我怎样才能在这个上下文中动态地注入一个新词?是否可以?

我试过了:

在 foo 'baz 3 中设置/任何

但这不起作用,因为表达式失败,因为上下文in foo 'baz中没有'baz定义单词。foo

我应该补充一点,我意识到这样做的一种方法如下:

foo 原型:[bar:3]
foo:上下文 foo 原型
foo: 上下文头附加 foo-prototype [baz: 3]

但是,如果您无权访问foo的原型块怎么办?

4

3 回答 3

8

您可以通过使用现有对象作为原型来创建新对象来实现相同的目的。

>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
    bar: 3
    baz: 3
]
于 2009-01-10T10:48:54.210 回答
4

有几种方法可以解决在 REBOL/2 中无法扩展对象上下文这一事实。

可能你可以只使用 BLOCK!s 而不是 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

您甚至可以通过附加对象本身来使 'self 工作:

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

但是当您要求扩展OBJECT!s时,您可能会选择 Peter WA Wood 的解决方案来简单地克隆对象。请记住,使用这种方法生成的克隆确实与原始对象不同。

因此,如果在克隆/扩展之前已将某个词设置为保存对象,则在克隆对象后,该词仍将保存未扩展的对象:

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

如果您必须保持对对象的“引用”不变,您可能希望将需要扩展的对象包装在外部对象中,如

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

然后,您可以在保留的同时扩展对象,因为您只存储对容器的引用。

顺便说一句,REBOL/3 将允许向 OBJECT!s 添加单词。

于 2009-01-10T19:41:56.910 回答
1

在 REBOL/Core User Guide 中说:“许多块包含其他块和字符串。复制这样的块时,不会复制其子系列。子系列是直接引用的,与原始块是相同的系列数据。”

于 2010-11-18T07:06:28.053 回答