我的第一个假设是对象和上下文是同义词。所以我创建了一个对象o
和一个上下文c
。探测它们报告相同的代码构造,并且类型是相同的(都是类型对象!):
>> o: make object! [a: 1 b: 2]
>> c: context [a: 1 b: 2]
>> probe o
make object! [
a: 1
b: 2
]
>> probe c
make object! [
a: 1
b: 2
]
>> type? o
== object!
>> type? c
== object!
...但是在测试平等时,你会得到:
>> equal? o c
== false
所以很明显它们不是同义词。为什么不进行探测呢?
答案 0 :(得分:4)
您进行了上下文对象比较,但没有进行对象到对象的比较!他们会在Rebol2中测试相同吗?我们试试......
>> equal? (make object! [a: 1]) (make object! [a: 1])
== false
都能跟得上! equal?
在Rebol 2中不适用于对象。由于神秘的内部原因,我们没有代码。 : - /在Rebol3(即open source)中,它们的测试相同,但是:
>> equal? (make object! [a: 1]) (make object! [a: 1])
== true
上下文也将测试与其对应的对象相同:
>> equal? (context [a: 1]) (object [a: 1])
== true
当我发现对象是修改其输入块的夹层时,我首先发现了Rebol3中对象和上下文之间的区别。这让我很困惑。
>> source object
object: make function! [[
"Defines a unique object."
blk [block!] "Object words and values (modified)"
][
make object! append blk none
]]
>> source context
context: make function! [[
"Defines a unique object."
blk [block!] "Object words and values (modified)"
][
make object! blk
]]
显而易见的结果是,您可以创建一个没有终端值的对象,例如object [a: b: c:]
,而使用上下文,您必须编写context [a: b: c: none]
以防止它成为错误。
(注意:我实际上不确定为什么那个上下文的错误案例是如此重要,或者为什么让它不是对象的错误案例是如此重要。在我看来,“制造对象!“可以选择一个内部期望并坚持下去 - 然后摆脱上下文的话,每个人都会有点不那么困惑。也许有人会发表评论澄清这一点?”