艾菲尔 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)
,可以是 True
或 False
,具体取决于 o1
和 o2
的值。
我试图更好地理解 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)
,可以是 True
或 False
,具体取决于 o1
和 o2
的值。