提问人:boulder_ruby 提问时间:2/9/2016 最后编辑:sawaboulder_ruby 更新时间:2/10/2016 访问量:83
对三个或更多对象进行相等性测试
Equality test on three or more objects
问:
如果我有三个或更多这样的对象:
a = 4
b = 4
c = 4
d = 2
确定它们是否相等的干净的红宝石式方法是什么?对三个或更多元素运行相等性测试的任何定制方法?
我想我可以做这样的事情:
arrays = [a,b,c,d].map{|x| [x]}
arrays.first == arrays.reduce(:&) ? true : false
这似乎有效,但感觉有点笨拙,其他开发人员可能难以阅读。
答:
6赞
kipar
2/9/2016
#1
[a,b,c,d].any?{|x| x != a}
或
array.any?{|x| x != array.first}
或者,#all?对于某些人来说,方法可能读起来更直观:
array.all? {|x| x == array.first }
评论
0赞
guitarman
2/9/2016
问题是“所有人都是平等的”,而不是任何一个或一个是平等的。
0赞
boulder_ruby
2/9/2016
无论哪种方式都有效。我认为这种方法更常用any?
0赞
darch
2/10/2016
@guitarman 根据平等的传递性质,证明一个可以证明另一个。(如果你对平等的定义不是及物的,那你就搞砸了,儿子。
2赞
Aleksei Matiushkin
2/9/2016
#2
我认为@kipar的答案无论如何都更好,但为了“按照你开始的方式做”,我会在这里发布这个:
[a, b, c, d].reduce { |r, e| r == e && r } && true
5赞
sawa
2/9/2016
#3
[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?
[a, b, c, d].uniq.length.one?
评论
2赞
boulder_ruby
2/9/2016
我特别喜欢最后一个。这和我见过的任何其他东西一样好
0赞
Cary Swoveland
2/10/2016
您忘记了,如果如示例中所示,这些值具有可比性,当然还有:-)。require 'set'; [a,b,c,d].to_set.size==1
[a,b,c,d].minmax==[a,a]
slice_when
评论
arrays = ["a", "a", "a", "b"].map { |x| [x] }; arrays.first == arrays.reduce(:&) ? true : false
>2