Types 什么';平等有那么难吗?
例如,在Javascript中,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在这方面并不是唯一的,几乎每种语言都将相等作为引用相等来实现,除了最基本的类型,如整数和一些内置类型 为什么会这样?使默认的相等运算符更强大有什么困难?那么,与其只是比较参考文献,为什么还要比较结构属性如此困难呢 我知道许多语言都提供了重载某些运算符以表示其他内
[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