Согласно моему опыту, просто хранят токен в localStorage.
localStorage :
может хранить информацию до 5 МБ. Вам не нужно спрашивать у пользователя разрешения на сохранение токена в localStorage.
Единственная проблема заключается в том, поддерживает ли целевое устройство API-интерфейс localStorage.
Проверьте здесь: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
Широко поддерживается. Но по моему опыту, если у вас есть приложение ios, и в этом приложении есть html-страница, которая просит пользователя сохранить токен (также называемый webview), API localStorage не может быть распознан и выдает ошибку.
Решение заключается в том, что я просто помещаю токен в URL и каждый раз передаю его. В веб-просмотре URL не виден.
Cookie:
Это очень старый стиль для хранения информации локально. Хранение в cookie относительно невелико, и вам необходимо запросить разрешение пользователя для сохранения токена в cookie.
Файлы cookie отправляются с каждым запросом, поэтому они могут ухудшить производительность (особенно для мобильных соединений для передачи данных). Современные API для клиентского хранилища - это API веб-хранилища (localStorage и sessionStorage) и IndexedDB. ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies )
Не хранить токен в sessionStorage или redux.
Данные, сохраненные в sessionStorage, будут потеряны, если вкладка закрыта. Если пользователь случайно закрыл вкладку, токен теряется, и сервер не сможет идентифицировать текущего пользователя. Токен, сохраненный в redux, не отличается от других js-файлов. Излишнее хранилище - это просто еще один JS-файл информация, сохраненная в избыточном коде, теряется при каждом обновлении страницы.
В заключение,
большую часть времени токен сохраняется в localStorage, если используется современный стиль. В определенных сценариях вы можете хранить токен в cookie и иногда помещать его в URL. Но никогда не храните в сессии.
Надеюсь, это поможет.
Ruby имеет функцию zip:
[1,2].zip([3,4]) => [[1,3],[2,4]]
таким образом, Ваш пример кода на самом деле:
a.zip(b).all? {|pair| pair[0] === pair[1]}
или возможно более кратко:
a.zip(b).all? {|a,b| a === b }
Могли Вы не делать:
a.eql?(b)
Отредактированный для добавления примера:
a = %w[a b c]
b = %w[1 2 3]
c = ['a', 'b', 'c']
a.eql?(b) # => false
a.eql?(c) # => true
a.eql?(c.reverse) # => false
Это от рубиновой спецификации:
it "returns true if other has the same length and each pair of corresponding elements are eql" do
a = [1, 2, 3, 4]
b = [1, 2, 3, 4]
a.should eql(b)
[].should eql([])
end
Таким образом, Вы должны, это должно работать на пример, который Вы упомянули.
Если Вы не используете целые числа, но пользовательские объекты, я думаю, что необходимо переопределить eql?.
Спецификация для этого метода здесь:
http://github.com/rubyspec/rubyspec/tree/master/1.8/core/array/eql_spec.rb