eiffel - Eiffel:类型转换运算符 ~ / 和附加语句有什么区别?
问题描述
有什么区别
对象测试
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
for reference objects 意味着a
和b
是别名。如果其中一个操作数是扩展对象,=
则与对象相等性相同(见下文)。如果表达式
dog = animal
返回True
,变量dog
和animal
引用同一个对象,但我们不知道它是什么类型。对象相等
~
比较两个对象的内容。首先,它检查两者都是非空的,具有相同的类型,然后调用(用户定义的)谓词is_equal
来获取运算符的结果。如果表达式
dog ~ animal
返回True
,则变量dog
和animal
可以是相同或不同的具有相同类型且相等的对象(根据is_equal
)。与前一种情况一样,我们不知道它们是什么类型。
1、3 和 4 记录在语言标准中,2 是类的特征TYPE
(具有相应的名称attempted
)。
推荐阅读
- c# - 内存流(Xls) 转 PDF
- javascript - 更改选项卡时 Chrome 扩展程序中断
- java - 如何在 SpringBoot 测试中获取正在运行的服务器端口?
- javascript - 在纯 JavaScript 中从另一个文件导入类
- mysql - MySQL 到 Drupal 7 db_select
- oracle - ORA-02049: 超时: 分布式事务等待锁定
- c# - 由于内容类型,ServiceBusTrigger 消息无法读取 BrokeredMessages
- jenkins - 如何使 Jenkins 构建仅针对特定测试失败?
- android - OnRecomputeFinished 不会被调用
- regex - 匹配逗号,不包括括号中的逗号 - 用于 Google 表格的 RE2