平等有什么困难?
例如,在Javascript中[1,2,3] === [1,2,3]
和[1,2,3] == [1,2,3]
都是错误的。 即使更简单的空数组也是错误的。 原因是数组是引用类型, [1,2,3]
和[1,2,3]
与引用不同。 Javascript在这方面并不是独一无二的,几乎所有的语言都实现了相等性,因为除了最基本的类型,比如整数和一些内置类型之外,它们是引用相等的。
为什么会这样? 使默认的相等运算符变得更强大有什么困难? 因此,不仅仅是比较参考,为什么很难比较结构特性呢?
我知道许多语言提供了一些功能来重载某些运算符来表示别的东西,所以==
将意味着你想要它的意思,而不是通常的弱引用等式。 我的问题不在于语言是否提供了这样的设施,而是为什么默认的相等运算符不是更明智的,因此默认情况下[1,2,3] == [1,2,3]
计算结果为true,并且不需要程序员干预。
在python中,上面的例子评估为true,但是如果你定义了下面的类
class A:
def __init__(self, prop):
self.prop = prop
然后比较a = A(1)
到b = A(1)
那么即使结构上的a
和b
是相同的,如果你知道的只是定义了位模式的位模式,那么答案也是假的物体。
并非所有的语言都以您描述的方式工作。 例如,在Python中==
是平等的, is
是参考比较:
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
>>> a is b
False
并非所有的语言都这样做。 C ++在对象上使用==
意味着相等(尽管指针上==
意味着引用相等)。 我相信(尽管我不完全确定)D编程语言预留了==
的值相等性和is
运算符的参考相等性。
我认为这只是针对JavaScript和其他一些语言的设计决定。 没有理由必须这样。
几乎所有的语言都实现了平等作为参考平等
正如这个问题的types
标签所表明的那样,许多语言将相等作为类型的行为。 这是有道理的:大多数类型都会有一些属性可以在实例中发生变化,而不会改变实例的语义“值”。
所以我给出的答案是:平等并不难,这取决于类型来定义什么样的实例是平等的。 如果没有这样明确的决定,任何违约都应该保守。
如果你正在创建一个自定义类型,那你就有责任去决定; 如果语言支持继承,请用它来表达您的决定:“平等应该像其他更基本类型一样”。 否则,为该类型显式地编写相等性测试,就像为您认为具有正确行为的现有类型所做的那样。
链接地址: http://www.djcxy.com/p/73781.html上一篇: What's so hard about equality?
下一篇: C++ Deleting a specfic value in a vector without knowing location