Почему делает uniq! возвратите ноль, при отсутствии дубликатов

Я только запускаю с Ruby, и я лично нахожу, что следующее нарушение "принципа наименьшего количества удивления". И то есть, заключая в кавычки из документации, это uniq! "удаляет дублирующиеся элементы из сам. Ноль возвратов, если никакие изменения не внесены (то есть, никакие дубликаты не найдены)".

Кто-либо может объяснить это, которое кажется абсолютно парадоксальным мне? Это означает что, а не способность записать одну строку кода ниже путем добавления .uniq! для окончания первой строки я вместо этого должен записать следующие две строки:

  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks = hooks.uniq

Или я пропускаю что-то, лучший путь?

Править:

Я понимаю это uniq! изменяет его операнд. Вот проблема, проиллюстрированная лучше, что я надеюсь:

  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  puts hooks.length #50
  puts hooks.uniq!.length #undefined method `length' for nil:NilClass

Я утверждаю что путь uniq! работы делают это абсолютно бессмысленным и бесполезным. Уверенный в моем случае, как указано я мог просто добавить .uniq к первой строке. Однако позже в той же программе я продвигаю элементы на другой массив в цикле. Затем под циклом я хотел бы "дедуплицировать" массив, но я не осмеливаюсь писать 'hooks_tested.uniq!' потому что это могло возвратить ноль; вместо этого я должен записать hooks_tested = hooks_tested.uniq

Действительно я утверждаю, что это - особенно вопиющая ошибка, в которой это - известный принцип, что, при разработке метода, который возвращает массив, нужно всегда, по крайней мере, возвращать пустой массив, а не ноль

11
задан dsolimano 27 February 2013 в 20:57
поделиться

3 ответа

Это связано с тем, что UNIQ! модифицирует себя и если UNIQ! вернет бы значение, которое вы не сможете знать, произошло ли изменение фактически в исходном объекте.

var = %w(green green yellow)
if var.uniq!
  # the array contained duplicate entries
else
  # nothing changed
end

В вашем коде вы можете просто написать

hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks.uniq!
# here hooks is already changed

, если вам нужно вернуть значение крюка, возможно, потому что это последнее утверждение метода, просто делаю

def method
  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks.uniq
end

или иным образом

def method
  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks.uniq!
  hooks
end
10
ответ дан 3 December 2019 в 05:58
поделиться

Восклицательный знак на UNIQ! указывает, что он изменяет массив вместо того, чтобы вернуть новый. Вы должны сделать это:

hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/).uniq

или это

hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks.uniq!
puts hooks.length
5
ответ дан 3 December 2019 в 05:58
поделиться

Ваше первое обновление на самом деле ничего не модифицируют:

update Book set name = name where id = 1

THY A A A A A A A A A A A A THY, которая фактически меняет вашу колонку, то в строке будет проведен эксклюзивный замок.

-121--3159680-

Вы можете добавить UNIQ (без восклицательного знака в конце) до конца первой строки.

Или, если вы настаиваете на использовании UNIQ! , используйте

(hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)).uniq!
2
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

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