object - Rebol2 中的 OBJECT 和 CONTEXT 是同义词吗?

标签 object equality rebol 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!

...但是在测试相等性时,您会得到:
>> equal? o c
== false

所以很明显它们不是同义词。如果它们探测到完全相同,为什么不呢?

最佳答案

你做了一个上下文到对象的比较,但你没有做一个对象到对象的比较!它们在 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]以免出错。

(注意:我实际上不确定为什么将它作为上下文的错误案例如此重要,或者为什么它不是对象的错误案例如此重要。在我看来,“制作对象!”可能只是选择一个内部期望并坚持下去——然后去掉上下文这个词,每个人都会不那么困惑。也许有人会发表评论来澄清这一点?)

关于object - Rebol2 中的 OBJECT 和 CONTEXT 是同义词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053340/

相关文章:

C++ 对继承类强制执行条件

javascript - 确定 JavaScript 中循环数据结构是否相等的算法

parsing - 如何使用 REBOL 解析 HTML 标签内部?

c++ - 如何在运行时从 Windbg 扩展中的 DMP 文件获取类型信息?

javascript - 在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

java - 创建一个类来存储在 ArrayList 中创建的所有对象?

Rebol 函数和无限参数

ssl - 什么可能是这个 : ** Command Error: SSL Error: error:14077410:SSL routines:SSL23_GET_SERVER_HEL LO:sslv3 alert handshake failure 的原因

Python对象实例化

java - 使用反射动态创建和分配对象