2013-11-24 2 views
2

Сейчас я работаю через Руби Коан и я столкнулся с ситуацией, когда я хочу, чтобы выполнить следующие действия:Комбинирования логических операторов в Рубине

if ones > 2 || twos > 2 || threes > 2 || fours > 2 || fives > 2 || sixes > 2 
    #do something 
end 

Есть ли лучший способ кодирования этого Условный оператора?

Любая помощь очень ценится.

ответ

6

Do, как показано ниже, используя Enumerable#any?:

if [ones,twos,threes,fours,fives,sixes].any?{|e| e > 2 } 
    # do something 
end 

или Йорг W Mittag предложил -

if [ones,twos,threes,fours,fives,sixes].any?(&2.method(:<)) 
    # do something 
end 
+1

Вы можете даже выразить это в свободном от точек стиле, воспользовавшись тем, что 'a> b == b

+0

@ JörgWMittag Мне нравится этот стиль и выучил его из вашего ответа на более ранние дни. В этом случае я думал, что напишу его таким образом, но тот момент, который вы упомянули, не пришел мне на ум, а это «a> b == b

+1

@ JörgWMittag помните, что 'a> b == b

4

Использование Enumerable#max:

ones, twos, threes, fours, fives, sixes = 1, 2, 3, 4, 5, 6 
[ones, twos, threes, fours, fives, sixes].max > 2 
# => true 
[ones, twos, threes, fours, fives, sixes].max > 6 
# => false 

Если условие является более сложным с использованием Enumerable#any? является более предпочтительным в качестве ответа Arup Ракшит в.

+1

Nice. 'max_by' может быть полезна, если элементы массивов не являются числовыми/строковыми значениями (например, хэши). При этом вы можете выполнять более сложные условия. –

1

Вы можете также использовать Enumerable#find:

if [ones,twos,threes,fours,fives,sixes].find{|e| e > 2 } 
    # do something 
end 

Откровенно сказать, Enumerable#any? лучше ,

Смежные вопросы