两者之间有什么区别
对象测试
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
在哪里可以找到有关此文件的文档?
答案 0 :(得分:2)
构造之间的主要区别在于操作数类型和语义。
对象测试允许确定特定表达式的求值是否符合特定类型的值。符合条件的对象的值可以通过关联的对象测试本地获取。
类/
的运算符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
引用相同的对象,但我们不知道它是什么类型。
对象相等性~
比较两个对象的内容。首先,它检查两者都是非空的,具有相同的类型,然后调用(用户定义的)谓词is_equal
以获取运算符的结果。
如果表达式dog ~ animal
返回True
,则变量dog
和animal
可以是相同或不同的对象,它们具有相同的类型并且相等(根据{ {1}})。与前面的情况一样,我们不知道它们是什么类型。
1、3和4以语言标准记录,2是类is_equal
的功能(具有相应的名称TYPE
)。