Например, в 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 по умолчанию и не требует вмешательства программиста.
В питона в приведенном выше примере имеет значение верно, но если вы определяете следующий класс
class A:
def __init__(self, prop):
self.prop = prop
, а затем сравнить a = A(1)
с b = A(1)
, то ответ будет ложным, хотя структурно a
и b
одинаковы и есть нет способа рассказать им обособленно, если все, что вы знаете, это бит-шаблон, который определяет объект.
Почему предположение, что это трудно сделать только потому, что они решили реализовать его так, как они это сделали? – kinakuta
@kinakuta, потому что почти каждый язык там делает это так, что указывает на какой-то барьер. Если бы было легко, кто-то там бы реализовал язык, который делает очевидную вещь для равенства массива и более общих типов. – davidk01