在Rebol 2中:
>> foo: make object! [a: 10 b: 20]
>> foo/a
== 10
>> foo/b
== 20
>> first foo
== [self a b]
>> second foo
== [make object! [
a: 10
b: 20
] 10 20]
>> third foo
== [a: 10 b: 20]
>> fourth foo
** Script Error: fourth expected series argument of type:
series date port tuple event
** Near: fourth foo
所以你可以选择它,好像它是一个值为1,2,3的块。但是在Rebol 3中进行位置选择:
>> first foo
** Script error: cannot use pick on object! value
** Where: first
** Near: first foo
我认为现在已弃用(比如选择一个函数来获取其参数列表)。但是,我正在尝试翻译一些代码如下的代码:
bar: construct/with (third foo) mumble
(a)该代码有什么意义?
(b)我如何将其翻译为Rebol 3?
答案 0 :(得分:5)
first
,second
,third
等用于反射的用法确实已被弃用(这可能是非常明显的原因)。
一般替换为REFLECT,它使用FIELD参数指定要提取的信息。
REFLECT又由一组函数(有些人称之为“反射器”)包裹起来以方便起见:SPEC-OF,BODY-OF,WORDS-OF,VALUES-OF等。这些是首选的替代品使用FIRST等人的反思。幸运的是,那些“反射器”也被反向移植到R2(2.7.7+)。
如何将third foo
翻译为Rebol 3?
对象上反射THIRD的对应物是BODY-OF。
construct/with (third a) b
成语有什么意义?
它允许您通过合并 A和B构建一个新对象(A中的值优先于B)。
因此,您可以使用此习惯用法通过将实际用户提供的选项与默认对象合并来创建完整的“选项”对象。
答案 1 :(得分:3)
a)构造构建对象而不评估spec块。这意味着规范是some [set-word! any-type!]
形式(如果你使用另一个对象的主体,它将永远是这样)。 Construct / with使用第二个对象(mumble
)作为原型。
b)对象操作似乎已更改如下:
i)first object
被words-of object
ii)second object
被values-of object
iii)third object
被body-of object
或取代to block! object
因此,您的代码可以替换为:
bar: construct/with body-of foo mumble