我可以生成几行代码,但是我想知道是否有一个很好的干净Rubyesque方式来做到这一点。如果我还不清楚,我正在寻找的是一个数组方法,如果给出(例如)[3,3,3,3,3]
或["rabbits","rabbits","rabbits"]
,它将返回true,但是将返回false [1,2,3,4,5]
或["rabbits","rabbits","hares"]
。
由于
答案 0 :(得分:73)
如果给定的块对集合中的所有元素都返回true,则可以使用Enumerable#all?
返回true。
array.all? {|x| x == array[0]}
(如果数组为空,则永远不会调用该块,因此执行array[0]
是安全的。)
答案 1 :(得分:62)
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。根据您的需要而定。
答案 2 :(得分:10)
我也喜欢最喜欢的答案,简短而甜蜜。如果所有元素都来自同一个Enumerable类,例如Numeric或String,则可以使用
def all_equal?(array) array.max == array.min end
答案 3 :(得分:2)
我以前用过:
array.reduce { |x,y| x == y ? x : nil }
array
包含nil
时可能会失败。
答案 4 :(得分:1)
我会用:
array = ["rabbits","rabbits","hares", nil, nil]
array.uniq.compact.length == 1