pep*_*pep 5 equality rebol object rebol2
我的第一个假设是对象和上下文是同义词.所以我创建了一个对象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!
Run Code Online (Sandbox Code Playgroud)
...但是在测试平等时,你得到:
>> equal? o c
== false
Run Code Online (Sandbox Code Playgroud)
所以很明显它们不是同义词.如果他们探测完全相同,为什么不呢?
您进行了上下文到对象的比较,但没有进行对象到对象的比较!他们在 Rebol2 中的测试结果会相同吗?咱们试试吧...
>> equal? (make object! [a: 1]) (make object! [a: 1])
== false
Run Code Online (Sandbox Code Playgroud)
没有! equal?不适用于 Rebol 2 中的物体。由于神秘的内部原因,我们没有代码。:-/ 在 Rebol3(开源)中,它们确实测试相同,但是:
>> equal? (make object! [a: 1]) (make object! [a: 1])
== true
Run Code Online (Sandbox Code Playgroud)
上下文也将测试为等于其相应的对象:
>> equal? (context [a: 1]) (object [a: 1])
== true
Run Code Online (Sandbox Code Playgroud)
当我注意到对象是一个修改其输入块的夹层时,我第一次发现了 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
]]
Run Code Online (Sandbox Code Playgroud)
显而易见的结果是,您可以创建一个没有最终值的对象,就像object [a: b: c:]使用上下文一样,您必须编写context [a: b: c: none]以防止出现错误。
(注意:我实际上不确定为什么它是上下文的错误情况如此重要,或者为什么它不是对象的错误情况如此重要。在我看来,“make object!”可能只是选择一个内在期望并坚持下去——然后去掉上下文这个词,每个人都不会那么困惑。也许有人会发表评论来澄清这一点?)