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
    

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

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

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

  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
    
  3. 引用相等=(大多数时候(比较对象引用,与它们的类型无关。换句话说,对于参考对象,a = b意味着ab是别名。如果其中一个操作数是扩展对象,则=与对象相等(见下文(相同。

    如果表达式dog = animal返回True,则变量doganimal引用同一对象,但我们不知道它是什么类型

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

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

1、3和4记录在语言标准中,2是类TYPE的一个特征(对应名称为attempted(。

最新更新