之间有什么区别
-
对象测试
if attached {DOG} an_animal as a_dog then a_dog.eat (meat) end
-
类别
TYPE
的运算符/
if an_animal / a_dog then an_animal.eat (food) end
-
参考等式
=
if a_dog = an_animal then a_dog.eat (meat) else an_animal.eat (food) end
-
对象相等
~
if a_dog ~ an_animal then a_dog.eat (meat) else an_animal.eat (food) end
在哪里可以找到相关文档?
结构之间的主要区别在于操作数类型和语义。
-
对象测试允许计算特定表达式的计算结果是否符合特定类型。合格对象的值可以通过关联的对象测试本地检索。
-
如果传递的参数符合类型对象指定的类型,则类
TYPE
的运算符/
返回该参数的值。否则,它将为引用类型返回Void
,为扩展类型返回默认值。这与对象测试非常相似,但略有不同。从本质上讲,表达式{SOME_TYPE} / expression
等价于if attached {SOME_TYPE} expression as value then value else {detachable SOME_TYPE}.default end
对于参考类型,对象测试
attached {SOME_TYPE} expression as value
等效于attached ({SOME_TYPE} / expression) as value
但是,扩展类型没有等价物。
运算符
/
的主要用途是在可能的情况下获得特定类型的值,否则为Void
:x := {SOME_TYPE} / expression
-
引用相等
=
(大多数时候(比较对象引用,与它们的类型无关。换句话说,对于参考对象,a = b
意味着a
和b
是别名。如果其中一个操作数是扩展对象,则=
与对象相等(见下文(相同。如果表达式
dog = animal
返回True
,则变量dog
和animal
引用同一对象,但我们不知道它是什么类型 -
对象相等
~
比较两个对象的内容。首先,它检查两者是否为非void,是否具有相同的类型,然后调用(用户定义的(谓词is_equal
来获得运算符的结果。如果表达式
dog ~ animal
返回True
,则变量dog
和animal
可以是具有相同类型且相等的相同或不同对象(根据is_equal
(。和前面的情况一样,我们不知道它们是什么类型的。
1、3和4记录在语言标准中,2是类TYPE
的一个特征(对应名称为attempted
(。