Проблемы с Ruby "||" "или же"? - PullRequest
2 голосов
/ 12 мая 2010

Начало Руби Вопрос:

Я пытаюсь проверить, является ли содержимое строковой переменной "личным", "электронным письмом" или "паролем".

Я пытаюсь:

if params[:action] == "password" || "email" || "personal"
  foo
else
  don't foo
end

Но это не работает и возвращает странные результаты, и используя IRB, чтобы поиграть с утверждениями "или", я понятия не имею, почему происходит следующее:

irb(main):040:0> a = "email"
=> "email"
irb(main):041:0> a == "password" || "email"
=> "email"
irb(main):042:0> a == "email" || "password"
=> true

Я просто хочу что-то, что, если любая из 3 переменных верна, независимо от того, в каком порядке они находятся, она возвращает истину, если нет, она возвращает ложь. Кто-нибудь хочет помочь этому n00b?

Ответы [ 3 ]

13 голосов
/ 12 мая 2010

У этой конкретной проблемы будет много хороших решений, но вместо этого я сконцентрируюсь на логике boolean в образовательных целях

Вы захотите сделать это:

(a == "password") || (a == "email) || (a == "password")

Языки программирования не похожи на английский: в нем есть строгое грамматическое правило, и вместо него говорят:

"if x is 3 or 5"

в большинство языков программирования, вы должны сказать:

if x is 3 or x is 5

Точно так же, как обычно в математической записи, сказать:

"if a < b < c"

в большинство языков программирования, вы должны сказать:

if a < b and b < c

Посмотрим, что произойдет с вашим экспериментом:

 a == "password" || "email"

Из-за того, что называется «приоритет оператора», это анализируется как:

 (a == "password") || "email"

Теперь, начиная с a == "email", это, по сути, оценивается как:

 false || "email"

, поэтому это выражение оценивается как "email".

Аналогично, с:

 a == "email" || "password"

Это по сути

 true || "password"

и поэтому он оценивается как true.

5 голосов
/ 12 мая 2010

Оператор case также подходит для сопоставления того или иного или ...

case email
when "password", "email", "whatever"
  puts "found a match: #{email}"
else
  puts "no match"
end
0 голосов
/ 21 июля 2011

Иногда я использую эту версию:

if ["password","email","personal"].include?(params[:action])
   foo
else
   don't foo
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...