2017-01-22 5 views
2

Я не вижу практической разницы между булевыми операторами AND и OR в случае Ruby case.Нет разницы между булевыми операторами И и ИЛИ в случае условного в Ruby

Например, я хочу, чтобы пользователю ввести фразу:

sudo make me a sandwich 

И случай условными начинается следующим образом:

case user_selection 
when /sudo/ && /sandwich/ 

Однако, если пользователь вводит:

make me a sandwich 

Состояние будет удовлетворено.

Мой путь вокруг него в этом случае состоит в повторном заказе условия:

case user_selection 
when /sandwich/ && /sudo/ 

Но что заранее предполагает, что каждый раз, когда пользователь думает использовать «Суда», они будут включать в себя строку «сэндвич» в их ответе. Тем не менее, это не является функционально ничем не отличается от этого:

case user_selection 
when /sudo/ 

Я посмотрел логические операторы для Ruby, условных, но не нашел удовлетворительный ответ.

ответ

6

Вы не можете использовать && в таком случае, потому что when /sudo/ && /sandwich/ оценивает только when /sandwich/.

Вместо этого вам нужно будет использовать один regexp, который ищет оба слова. Простым примером может служить:

case user_selection 
when /sudo.*sandwich/ 
+0

Удовлетворительный факт: вы можете использовать список разделенных запятыми 'OR' вместе, как в' when/a /,/b/' – akuhn

+0

Спасибо @akuhn, я знаю про запятую - очень удобно для тех, кто Не знаю. – clockworkpc

+0

Спасибо @spickerman! Это сработало отлично. – clockworkpc

2

Только для справки.

Если вы абсолютно необходимо логическое И в вашем случае заявление, вы можете использовать лямбда:

def answer(order) 
    case order 
    when ->(x) { x =~ /sudo/ && x =~ /sandwich/ } 
    puts 'Okay' 
    else 
    puts 'Do it yourself!' 
    end 
end 

answer 'make me a sandwich' 
#=> Do it yourself! 
answer 'sudo sing a song' 
#=> Do it yourself! 
answer 'sudo make me a sandwich' 
#=> Okay 

Если вы можете уплотнить булевой логики к одной проверки (например, с помощью Regex), вы, вероятно, следует , как в @ spickermann's answer.

+0

Downvoter: Пожалуйста, сообщите, что случилось с моим ответом. Он работает, он отвечает на вопрос, но все же утверждает, что альтернатива от spickermann лучше. –

+0

Спасибо, это тоже очень полезно. – clockworkpc