三个或更多对象的相等测试
Equality test on three or more objects
如果我有三个或更多这样的对象:
a = 4
b = 4
c = 4
d = 2
什么是干净的 ruby 风格的方法来确定它们是否都相等? 运行 对三个或更多元素进行相等性测试的任何定制方法?
我想我可以这样做:
arrays = [a,b,c,d].map{|x| [x]}
arrays.first == arrays.reduce(:&) ? true : false
这看起来可行,但感觉有点笨拙,其他开发人员可能难以阅读。
[a,b,c,d].any?{|x| x != a}
或
array.any?{|x| x != array.first}
或者,#all?对于某些人来说,方法可能更直观:
array.all? {|x| x == array.first }
我认为@kipar 的回答无论如何都更好,但为了“按照你开始的方式去做”,我会 post 在这里:
[a, b, c, d].reduce { |r, e| r == e && r } && true
[a, b, c, d].group_by(&:itself).length == 1
# => false
或
[a, b, c, d].chunk(&:itself).to_a.length == 1
# => false
或
[a, b, c, d].chunk_while(&:==).to_a.length == 1
# => false
或者天真:
[a, b, c, d].uniq.length == 1
我想起了 one?
。前提是你没有任何falsy元素,上面可以写成:
[a, b, c, d].uniq.length.one?
如果我有三个或更多这样的对象:
a = 4
b = 4
c = 4
d = 2
什么是干净的 ruby 风格的方法来确定它们是否都相等? 运行 对三个或更多元素进行相等性测试的任何定制方法?
我想我可以这样做:
arrays = [a,b,c,d].map{|x| [x]}
arrays.first == arrays.reduce(:&) ? true : false
这看起来可行,但感觉有点笨拙,其他开发人员可能难以阅读。
[a,b,c,d].any?{|x| x != a}
或
array.any?{|x| x != array.first}
或者,#all?对于某些人来说,方法可能更直观:
array.all? {|x| x == array.first }
我认为@kipar 的回答无论如何都更好,但为了“按照你开始的方式去做”,我会 post 在这里:
[a, b, c, d].reduce { |r, e| r == e && r } && true
[a, b, c, d].group_by(&:itself).length == 1
# => false
或
[a, b, c, d].chunk(&:itself).to_a.length == 1
# => false
或
[a, b, c, d].chunk_while(&:==).to_a.length == 1
# => false
或者天真:
[a, b, c, d].uniq.length == 1
我想起了 one?
。前提是你没有任何falsy元素,上面可以写成:
[a, b, c, d].uniq.length.one?