- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
a = {}
a[{}] = 100500
local store
for i, k in pairs(a) do
print(i,k) --table, 100500
store = i
end
print(a[{}]) --nil
print(a[store]) --100500
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+14
a = {}
a[{}] = 100500
local store
for i, k in pairs(a) do
print(i,k) --table, 100500
store = i
end
print(a[{}]) --nil
print(a[store]) --100500
автор не нужен
> a[{}] = 100500
> print(a[{}]) --nil
false
Потому что каждый литерал таблицы создаёт новый объект, и их сравнение неглубокое.
Што?
== сравнивает равенство или идентичность?
>Што?
Объекты не сравниваются с точностью до полей и полей полей, и полей полей полей, ..., то есть структуру объекта глубоко не копают.
Что есть объект? Совокупность полей как таковых или иерархическое представление с учётом зависимостей?
Если первое, то неглубокое сравнение, отличаемое от сравнения идентичности ссылок не должно отличаться от глубокого, т.к. нет необходимости проходить по ссылкам.
Соответственно, различая неглубокое и глубокое сравнение, мы различаем алгоритмы по наличию или отсутствию сравнения идентичности ссылок при проверке эквивалентности полей объекта, сравнение идентичности ссылок является частью неглубокого сравнения.
Если мы представляем объект в виде некоторого дерева, построенного на ссылках, и работаем с объектом по ссылке, мы логически сопоставляем наш иерархический объект и эту ссылку. Ссылку можно рассматривать как 1-набор или структуру с одним полем, а значит сравнение по ссылке считать неглубоким сравнением объектов, причём это имеет смысл.
Это что? Вагина? С волосатой родинкой слева?