对三个或更多对象进行相等性测试

Equality test on three or more objects

提问人:boulder_ruby 提问时间:2/9/2016 最后编辑:sawaboulder_ruby 更新时间:2/10/2016 访问量:83

问:

如果我有三个或更多这样的对象:

a = 4
b = 4
c = 4
d = 2

确定它们是否相等的干净的红宝石式方法是什么?对三个或更多元素运行相等性测试的任何定制方法?

我想我可以做这样的事情:

arrays = [a,b,c,d].map{|x| [x]}
arrays.first == arrays.reduce(:&) ? true : false

这似乎有效,但感觉有点笨拙,其他开发人员可能难以阅读。

Ruby 平等

评论

0赞 Cubic 2/9/2016
更不用说您的方法实际上仅适用于整数。
0赞 boulder_ruby 2/9/2016
确定吗? 我认为会起作用arrays = ["a", "a", "a", "b"].map { |x| [x] }; arrays.first == arrays.reduce(:&) ? true : false
0赞 sawa 2/9/2016
n + 2 是什么意思?什么是n?
0赞 boulder_ruby 2/9/2016
我想是 n+3。因为 n 可以是 0。我基本上是说.我只是在标题中将其更改为该名称>2

答:

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