11

是否有一种简单的方法可以测试几个变量在 ruby​​ 中具有相同的值?

一些东西链接这个:

if a == b == c == d #does not work
   #Do something because a, b, c and d have the same value
end

当然,可以根据主控检查每个变量,看看它们是否都是真的,但这有点更多的语法并且不是那么清楚。

if a == b && a == c && a == d #does work
    #we have now tested the same thing, but with more syntax.
end

您需要这样的东西的另一个原因是,如果您在测试之前确实对每个变量进行了处理。

if array1.sort == array2.sort == array3.sort == array4.sort #does not work
    #This is very clear and does not introduce unnecessary variables
end
#VS
tempClutter = array1.sort
if tempClutter == array2.sort && tempClutter == array3.sort && tempClutter == array4.sort #works
   #this works, but introduces temporary variables that makes the code more unclear
end
4

5 回答 5

23

将它们全部放入一个数组中,看看是否只有一个独特的项目。

if [a,b,c,d].uniq.length == 1
  #I solve almost every problem by putting things into arrays
end

正如sawa在评论中指出的那样。一个?如果它们都是 false 或 nil,则失败。

于 2013-05-15T05:55:09.667 回答
5

tokland在他对类似问题的评论中提出了一种非常好的方法:

module Enumerable
  def all_equal?
    each_cons(2).all? { |x, y| x == y }
  end
end

这是迄今为止我见过的最简洁的表达方式。

于 2013-05-15T06:42:33.760 回答
3

怎么样:

[a,b,c,d] == [b,c,d,a]

真的只是:

[a,b,c] == [b,c,d]

会做

于 2013-05-15T07:05:43.260 回答
2
a = [1,1,1]
(a & a).size == 1 #=> true

a = [1,1,2]
(a & a).size == 1 #=> false
于 2013-05-15T06:55:17.917 回答
1
[b, c, d].all?(&a.method(:==))
于 2013-05-15T19:00:45.957 回答