Types 什么';平等有那么难吗?

Types 什么';平等有那么难吗?,types,theory,equality,Types,Theory,Equality,例如,在Javascript中,[1,2,3]==[1,2,3]和[1,2,3]=[1,2,3]都是false。即使是空数组的简单情况也是错误的。原因是数组是引用类型,而[1,2,3]和[1,2,3]作为引用是不同的。Javascript在这方面并不是唯一的,几乎每种语言都将相等作为引用相等来实现,除了最基本的类型,如整数和一些内置类型 为什么会这样?使默认的相等运算符更强大有什么困难?那么,与其只是比较参考文献,为什么还要比较结构属性如此困难呢 我知道许多语言都提供了重载某些运算符以表示其他内

例如,在Javascript中,
[1,2,3]==[1,2,3]
[1,2,3]=[1,2,3]
都是false。即使是空数组的简单情况也是错误的。原因是数组是引用类型,而
[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
在结构上是相同的,并且如果您只知道定义对象的位模式,那么答案将是错误的。

并非所有语言都这样做。C++在对象上使用<代码>=< /> >来表示相等(虽然<代码>=< /代码>指针上确实意味着引用相等)。我相信(尽管我不能完全确定)D编程语言为值相等保留了
=
,而
为引用相等保留了
运算符


我认为这只是JavaScript和其他一些语言的设计决策。没有理由非要这样做。

并非所有语言都这样做。C++在对象上使用<代码>=< /> >来表示相等(虽然<代码>=< /代码>指针上确实意味着引用相等)。我相信(尽管我不能完全确定)D编程语言为值相等保留了
=
,而
为引用相等保留了
运算符


我认为这只是JavaScript和其他一些语言的设计决策。没有理由一定要这样。

并非所有语言都按照您描述的方式工作。例如,在Python中,
=
是相等的,
是引用比较:

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
>>> a is b
False

不是所有的语言都像你描述的那样工作。例如,在Python中,
=
是相等的,
是引用比较:

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
>>> a is b
False
几乎每种语言都将相等作为引用相等来实现

正如这个问题上的
types
标记所指出的,许多语言将平等作为类型的一种行为来实现。这很有意义:大多数类型都有一些属性可以在实例上更改,而不会更改该实例的语义“值”

所以我要给出的答案是:平等并不难,由类型来定义什么样的实例是平等的。在没有明确决定的情况下,任何违约都应该是保守的

如果您正在创建自定义类型,那么您有责任做出决定;如果语言支持继承,那么用它来表达您的决定,即“平等应该像其他更基本的类型一样”。否则,为该类型显式编写相等性测试代码,就像对您认为具有正确行为的现有类型所做的那样

几乎每种语言都将相等作为引用相等来实现

正如这个问题上的
types
标记所指出的,许多语言将平等作为类型的一种行为来实现。这很有意义:大多数类型都有一些属性可以在实例上更改,而不会更改该实例的语义“值”

所以我要给出的答案是:平等并不难,由类型来定义什么样的实例是平等的。在没有明确决定的情况下,任何违约都应该是保守的


如果您正在创建自定义类型,那么您有责任做出决定;如果语言支持继承,那么用它来表达您的决定,即“平等应该像其他更基本的类型一样”。否则,请为该类型显式编写相等性测试代码,就像对您认为具有正确行为的现有类型所做的一样。

为什么认为仅仅因为他们决定按他们的方式实现它就很难这样做?@kinakuta,因为几乎所有语言都是这样做的,这表明存在某种障碍。如果这很容易的话,有人会实现一种语言,这种语言对数组相等性和更一般的类型也有明显的作用。为什么仅仅因为他们决定按他们的方式实现它就很难做到呢?@kinakuta,因为几乎所有的语言都是这样做的,这表明了某种障碍如果这很容易的话,有人会实现一种语言,它对数组相等和更一般的类型也有明显的作用。因此在D
[1,2,3]=[1,2,3]
中计算结果为true?所以在D
[1,2,3]=[1,2,3]
计算结果为true?这是真的,但是如果我用自己的属性定义自己的自定义类,那么
a=Klass(val)
将不等于
b=Klass(val)
@davidk01:您需要为您的类实现。这就是所谓的
=
。是的。这是我的观点。有一个默认的
\uuuuueq\uuuuu
操作符做正确的事情有什么困难。好吧,我不明白你的意思。在Python中,
==
确实为Python的内置对象类型(包括数组)做了“正确的事情”。如果您实现了自己的类,那么您就是res