Я только запускаю с 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
Действительно я утверждаю, что это - особенно вопиющая ошибка, в которой это - известный принцип, что, при разработке метода, который возвращает массив, нужно всегда, по крайней мере, возвращать пустой массив, а не ноль
Это связано с тем, что 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
Восклицательный знак на 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
Ваше первое обновление на самом деле ничего не модифицируют:
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!