Size: a a a

Clojure — русскоговорящее сообщество

2021 January 15

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
если я правильно понимаю, там не так
сравниваются ссылки на объекты, если это один и тот же объект, то можно не рендерить
если разные, но пусть и равные, то перерендерим
и вот сравнение ссылок как раз O(1)
Там это где?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Anton Chikin
Там это где?
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
А в реакте. Ну да грубо говоря. Я так понимаю там не прямо ссылки сравниваются а через == или === - там ещё есть примитивы и строки на которых таки работает сравнение по значению
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Anton Chikin
А в реакте. Ну да грубо говоря. Я так понимаю там не прямо ссылки сравниваются а через == или === - там ещё есть примитивы и строки на которых таки работает сравнение по значению
если это js, то сравнение именно чере ==, а не через .equals
а == сравнивает ссылки
а кложовый = сравнивает через .equals
но есть и identiacal?
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
если это js, то сравнение именно чере ==, а не через .equals
а == сравнивает ссылки
а кложовый = сравнивает через .equals
но есть и identiacal?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
и если в кложескрипте в реакте сравнение чреез =, это не совсем корректно, и нужно брать identical?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
ну тут разница между == и === не принципиальна, мы же объекты сравниваем, а не примитивы
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
и если в кложескрипте в реакте сравнение чреез =, это не совсем корректно, и нужно брать identical?
Это зависит от семантики = . В кложе насколько я помню (= [1 2 3] (list 1 2 3)) вернёт true
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Anton Chikin
Это зависит от семантики = . В кложе насколько я помню (= [1 2 3] (list 1 2 3)) вернёт true
так я выше и писал, что кложовый = реализован через .equals
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
так я выше и писал, что кложовый = реализован через .equals
equls ни о чем не говорит в java он перегружается для каждого класса отдельно
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
еще раз
в реакте есть shouldComponentUpdate
Если у нас есть иммутабельные и даже персистентные объекты и мы хотим тратить O(1) на определение того, нужно ли что-то рендерить,
то нужно использовать js == или cljs identical?
в случае, если по какой-то причине там будут эквивалентые данные, то компонент перерендерится, хотя отрендерит он то же самое.

Если мы хотим не рендерить компоненты, если данные эквиваленты, то мы используем в js .equals или что там у них и в cljs =
в этом случае не будет O(1). В худшем случае нужно вообще всю коллекцию перебрать.
Но если коллекция персистентная, то сначала сравниваются ссылки, это приводит к тому, что не все поддеревья нужно сравнивать через equals, т.е. такая опртимизация

логически в контексте реакта и shouldComponentUpdate кложовые = и identical? эквиваленты
т.к. дом дерево всеравно будет эквивалентым
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Я с телефона если коротко то нет дела обстоят не так
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
(def a [q w e]) (def b [q w e]) (= a b) вернёт true хотя ссылки разные
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
ты внимательно прочитай что я пишу, а пишу я ровно это же самое
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Ссылки не сравниваются
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
В js нет equals
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
identical тоже не так работает и для сравнения по значению применяться не может
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
‘’’user=> (identical? 128 128)
false
user=> (identical? 127 127)
true’’’
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Как раз прикол кложурного сравнения в том что оно сравнивает правые части а не ссылки
источник