Eiffel:类型转换运算符 ~ / 和附加语句之间有什么区别?

Eiffel: type casting operators whats the difference between ~ / and attached statements?

有什么区别

我在哪里可以找到相关文档?

构造之间的主要区别在于操作数类型和语义。

  1. 对象测试可以确定特定表达式的计算结果是否符合特定类型。可以通过关联对象测试本地检索符合对象的值。

  2. 运算符/的classTYPEreturns传递参数的值,如果符合指定的类型类型对象。否则,它 returns 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
    
  3. 引用相等性= 比较(大部分时间)对象引用,与它们的类型无关。换句话说,引用对象的a = b意味着ab是别名。如果操作数之一是扩展对象,则 = 与对象相等性相同(见下文)。

    如果表达式dog = animalreturnsTrue,变量doganimal引用同一个对象,但我们不知道它是什么类型是.

  4. 对象相等~比较两个对象的内容。首先,它检查两者都是非空的,具有相同的类型,然后调用一个(用户定义的)谓词 is_equal 来获取运算符的结果。

    如果表达式 dog ~ animal returns True,变量 doganimal 可以是相同或不同的对象,具有相同的类型和相等(根据 is_equal)。与之前的情况一样,我们不知道它们是什么类型。

1、3和4在语言标准中有记载,2是class的一个特性TYPE(对应名称attempted)。