2013-05-15 12 views
9

Czy istnieje prosty sposób sprawdzenia, czy kilka zmiennych ma tę samą wartość w ruby?Prosty sposób na sprawdzenie, czy wiele zmiennych ma tę samą wartość, ruby ​​

Coś linke to:

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

Oczywiście możliwe jest, aby sprawdzić każdą zmienną przeciwko mistrza aby sprawdzić, czy wszystkie są prawdziwe, ale to jest składnia nieco więcej i nie jest tak oczywiste.

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

Innym powodem, dla którego potrzebujesz czegoś takiego, jest fakt, że faktycznie wykonujesz pracę nad każdą zmienną przed testowaniem.

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 

Odpowiedz

18

Wrzuć wszystkie do tablicy i sprawdź, czy jest tylko jeden unikatowy przedmiot.

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

Jak sawa wskazuje w komentarzach .one? kończy się niepowodzeniem, jeśli wszystkie są fałszywe lub zerowe.

+0

Nicea. To byłby zdecydowanie lepszy sposób niż przy zmiennych temp.! – Automatico

+3

Zauważ, że nie możesz użyć 'one?', Jeśli mają być 'nil' lub' false'. – sawa

+0

Niestety było tak pięknie. –

5

tokland sugerował bardzo miłe podejście w swoim komentarzu do similar question:

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

To najczystszy sposób wyrazić to widziałem do tej pory.

+0

Podoba mi się również to rozwiązanie, ale bez rozszerzenia modułu jest ono bardziej gadatliwe niż odpowiedź Shawna. – Automatico

2
a = [1,1,1] 
(a & a).size == 1 #=> true 

a = [1,1,2] 
(a & a).size == 1 #=> false 
+0

shuffle nie jest prawidłowy, może skończyć się w tej samej kolejności. –

+0

@Pitri Wiesz, że '[1,1,2] .shuffle' zwraca' [1,1,2] 'czasami, prawda? ;-) – Stefan

+0

Tak, masz rację częściowo; tak usunięty. Ale 'shuffle' ma zawsze miejsce, ale gdy zduplikowane przedmioty będą obecne, to się nie powiedzie. :) –

2

Jak o:

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

naprawdę tylko:

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

zrobi

1
[b, c, d].all?(&a.method(:==)) 
Powiązane problemy