Я только начинаю с Ruby, и лично я считаю, что следующее является нарушением "принципа наименьшего удивления". То есть, цитируя документацию , этот уникальный! "удаляет дубликаты элементов из себя. Возвращает ноль, если не было внесено никаких изменений (то есть дубликаты не найдены)."
Кто-нибудь может объяснить это, что мне кажется совершенно нелогичным? Это означает, что вместо возможности написать одну строчку кода ниже, добавив .uniq! чтобы закончить первую строку, я должен написать следующие две строки:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks = hooks.uniq
Или я что-то упустил, лучше?
EDIT:
Я понимаю, что 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 к первой строке. Однако позже в той же программе я помещаю элементы в другой массив внутри цикла. Затем, в цикле, я хотел бы "де-дублировать" массив, но я не осмелился написать 'hooks_tested.uniq!' потому что он может вернуть ноль; вместо этого я должен написать hooks_tested = hooks_tested.uniq
Действительно, я утверждаю, что это особенно вопиющая ошибка в том, что это хорошо известный принцип, что при разработке метода, возвращающего массив, всегда следует по крайней мере возвращать пустой массив, а не ноль