Я только начинаю с Ruby, и я лично считаю следующее нарушением "принципа наименьшего удивления". И это, цитируя документацию, что uniq! "удаляет повторяющиеся элементы из себя. Возвращает nil, если никаких изменений не производится (то есть, не найдены дубликаты).
Может кто-нибудь объяснить это, что кажется мне совершенно интуитивным? Это означает, что вместо того, чтобы писать одну строку кода ниже, добавив .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! работы делают его совершенно бессмысленным и бесполезным. Конечно, в моем случае, как указано, я мог просто добавить .uniq в первую строку. Однако позже в той же программе я нажимаю элементы на другой массив внутри цикла. Затем, под циклом, я хотел бы "де-обмануть" массив, но я не смею писать "hooks_tested.uniq!" потому что он мог бы вернуть нуль; вместо этого я должен написать hooks_tested = hooks_tested.uniq
Действительно, я утверждаю, что это особенно вопиющая неправильная особенность в том, что хорошо известный принцип заключается в том, что при разработке метода, который возвращает массив, всегда нужно как минимум возвращать пустой массив, а не nil