Удаление одинаковых объектов в Ruby?

Просто изменение window.location в JavaScript опасно , потому что пользователь мог все еще совершить нападки кнопка "Назад" и повторно отправить сообщение, которое могло иметь неожиданные результаты (такой как дублирующаяся покупка ). PRG является намного лучшим решением

Использование Отправление/Перенаправление/Получение (PRG) шаблон

Для предотвращения этой проблемы, много веб-приложений используют шаблон PRG — вместо того, чтобы возвратить страницу HTML непосредственно, операция POST возвращает команду перенаправления (использующий код ответа HTTP 303 (иногда 302) вместе с заголовком ответа "Местоположения" HTTP), давая браузеру команду загрузить другую страницу с помощью HTTP-запроса GET. Страница результатов может затем безопасно быть отмечена или перезагружена без неожиданных побочных эффектов.

5
задан Patrick O'Doherty 18 July 2013 в 12:40
поделиться

3 ответа

Удаляет ли дубликаты метод uniq поскольку эти объекты указывают на то же место в памяти или что они содержат идентичную информацию?

Метод полагается на метод eql? , поэтому он удаляет все элементы, где a.eql? (b) возвращает true. Точное поведение зависит от конкретного объекта, с которым вы имеете дело.

Например, строки считаются равными, если они содержат один и тот же текст, несмотря на то, что они имеют одинаковое распределение памяти.

a = b = "foo"
c = "foo"

[a, b, c].uniq
# => ["foo"]

Это верно для большей части ядра объектов, но не для рубиновых объектов.

class Foo
end

a = Foo.new
b = Foo.new

a.eql? b
# => false

Ruby рекомендует вам переопределить оператор == в зависимости от контекста вашего класса.

В вашем конкретном случае я бы предложил создать объект, представляющий результат twitter и реализуйте свою логику сравнения, чтобы Array.uniq вел себя так, как вы ожидаете.

class Result

  attr_accessor :text, :notes

  def initialize(text = nil, notes = nil)
    self.text = text
    self.notes = notes
  end

  def ==(other)
    other.class == self.class &&
    other.text  == self.text
  end
  alias :eql? :==

end

a = Result.new("first")
b = Result.new("first")
c = Result.new("third")

[a, b, c].uniq
# => [a, c]
11
ответ дан 18 December 2019 в 08:29
поделиться

uniq использует eql? , как описано в этой ветке .

См. официальную документацию по ruby ​​ для различий между == , equal? ​​ и eql? .

2
ответ дан 18 December 2019 в 08:29
поделиться

Я считаю, что Array.uniq обнаруживает дубликаты с помощью методов eql? или == объектов, что означает его сравнение на основе содержимого, а не расположения в памяти (при условии, что объекты предоставляют значимую реализацию eql? на основе содержимого).

0
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: