【问题标题】:Eiffel: Expanded classes with no fields are `=` or not?Eiffel:没有字段的扩展类是否是`=`?
【发布时间】:2016-11-13 23:53:46
【问题描述】:

在 Eiffel 中,如果比较扩展类型的对象,= 运算符会逐字段比较它们,检查两个对象中每个字段的内容是否相同。

让我们想象两个没有定义特征的扩展类:

expanded class A
end

expanded class B
end

埃菲尔如何区分它们?还是不能?是否与继承自ANY 的某些字段有关?

both_are_equal: BOOLEAN
    local
        a: expanded A
        b: expanded B
    do
        Result := a = b
    end

【问题讨论】:

    标签: operators eiffel


    【解决方案1】:

    仅当两个对象属于同一类型时,才会应用逐字段比较。如果它们属于不同类型,则相等运算符给出错误。换句话说,扩展类型的相等运算符 = 与语义上的相等运算符 ~ 相同

    type_of (a) = type_of (b) and then a.is_equal (b)
    

    因此both_are_equal 将提供False

    如果将 xy 的引用类型附加到扩展对象而不是扩展类型的 ab,则结果将相同 - 比较考虑了对象的类型:

    both_are_equal: BOOLEAN
        local
            a: expanded A
            b: expanded B
            x: ANY
            y: ANY
        do
            x := a
            y := b
            Result := x = y -- Gives False
        end
    

    但如果引用表达式附加到相同类型的扩展对象,则使用逐字段比较,而不是引用相等:

    both_are_equal: BOOLEAN
        local
            a: expanded A
            b: expanded A -- Note the type change
            x: ANY
            y: ANY
        do
            x := a
            y := b
            Result := x = y -- Gives True even though x and y are different objects
        end
    

    可以在Standard ECMA-367(第 8.21 节)和ANY 类中特定比较功能的合同中找到有关相等运算符的一些详细信息。

    【讨论】:

    • 感谢您的回答!能否请您添加一些文档的链接以供进一步阅读?
    • @g4v3,我在答案末尾添加了几个链接。目前该标准有点过时,但要点仍然有效。 ANY 类的源代码链接完全是最新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2015-01-18
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多