艾菲尔 is_equal() 函数

Eiffel is_equal() function

我试图更好地理解 is_equal() 中定义的函数 class COMPARABLE

我想知道在哪种情况下,对于对象 o 函数调用 o.is_equal(o) 给出 false.

我知道这个函数不同于=,它不仅比较对象的地址,还会比较它们所有的值属性。

根据这个定义,我很确定这样的调用总是会给出 true,因为我们比较的是同一个对象。

如果有人能向我解释我的想法有什么问题,我将不胜感激。

目前特征 is_equal 的起源是 class ANY,而不是 COMPARABLE。 Class COMPARABLE 重新定义了特征并添加了一个后置条件 trichotomy,它根据不等式(或者更准确地说,根据查询 is_less )指定相等的属性。因此,要了解发生了什么,让我们看看起源。

Class ANY 有一个不变量

reflexive_equality: standard_is_equal (Current)

同时特征is_equal有一个后置条件

consistent: standard_is_equal (other) implies Result

结合两者(即使不知道什么是standard_is_equal)我们可以推导出一个新的不变量

new_reflexive_equality: is_equal (Current)

这应该对每个对象都有效。因此,一旦表达式中的 o 始终产生相同的对象(例如,如果它是一个变量,而不是每次调用时 return 不同对象的函数), o.is_equal (o) 应该总是产生 True。当然,可以尝试将 is_equal 重新定义为 return False,但这会破坏该特征的契约。

在现实生活中,比较通常是 o1.is_equal (o2),可以是 TrueFalse,具体取决于 o1o2 的值。