Я могу генерировать несколько строк кода, которые сделают это, но я задаюсь вопросом, существует ли хороший чистый Rubyesque способ сделать это. В случае, если я не был ясен, что я ищу, метод массива, который возвратит true, если дали (говорят) [3,3,3,3,3]
или ["rabbits","rabbits","rabbits"]
но возвратит false с [1,2,3,4,5]
или ["rabbits","rabbits","hares"]
.
Спасибо
class Array
def same_values?
self.uniq.length == 1
end
end
[1, 1, 1, 1].same_values?
[1, 2, 3, 4].same_values?
А что насчет этого? Он возвращает false для пустого массива, однако вы можете изменить его на <= 1, и в этом случае он вернет true. В зависимости от того, что вам нужно.
Вы можете использовать Enumerable#all?
, который возвращает true, если заданный блок возвращает true для всех элементов коллекции.
array.all? {|x| x == array[0]}
(Если массив пуст, блок никогда не будет вызван, поэтому использование array[0]
безопасно)
Мне тоже нравится лучший, короткий и сладкий предпочтительный ответ. Если бы все элементы принадлежали к одному классу Enumerable, например Numeric или String, можно было бы использовать
def all_equal?(array) array.max == array.min end