это правильный синтаксис рубина? - PullRequest
2 голосов
/ 28 октября 2009
if step.include? "apples" or "banana" or "cheese"
say "yay"
end

Ответы [ 8 ]

6 голосов
/ 28 октября 2009

Несколько проблем с вашим кодом.

step.include? "apples" or "banana" or "cheese"

Это выражение оценивается как:

step.include?("apples") or ("banana") or ("cheese")

Поскольку Ruby обрабатывает все значения, кроме false и nil, как true, это выражение всегда будет истинным. (В этом случае значение "banana" вызовет короткое замыкание выражения и заставит его оценить как истинное, даже если значение шага не содержит ни одного из этих трех.)

Ваше намерение было:

step.include? "apples" or step.include? "banana" or step.include? "cheese"

Однако это неэффективно. Также он использует or вместо ||, который имеет другой приоритет оператора и обычно не должен использоваться в if условных выражениях.

Обычное or Использование:

do_something or raise "Something went wrong."

Лучший способ написать это было бы:

step =~ /apples|banana|cheese/

Здесь используется регулярное выражение , которое вы часто будете использовать в Ruby.

И, наконец, в Ruby нет метода say, если вы его не определите. Обычно вы печатаете что-то, звоня puts.

Итак, окончательный код выглядит так:

if step =~ /apples|banana|cheese/
  puts "yay"
end
3 голосов
/ 28 октября 2009

Последние два термина кажутся Ruby верными, а не имеют ничего общего с фразой include?.

Предполагая, что step является строкой ...

step = "some long string with cheese in the middle"

Вы могли бы написать что-то вроде этого.

puts "yay" if step.match(/apples|banana|cheese/)
2 голосов
/ 28 октября 2009

Вот способ вызова step.include? для каждого из аргументов, пока один из них не вернет true:

if ["apples", "banana", "cheese"].any? {|x| step.include? x}
1 голос
/ 28 октября 2009

Предполагая, что step является Array или Set или чем-то еще, поддерживающим пересечение множеств с оператором &, я думаю, что следующий код является наиболее идиоматическим:

unless (step & ["apples","banana","cheese"]).empty?
  puts 'yay'
end
1 голос
/ 28 октября 2009

Самым близким к этому синтаксису, который будет делать то, что вы хотите, было бы что-то вроде:

  if ["apples", "banana", "cheese"].include?(step)
    puts "yay"
  end

Но одно из других предложений, использующих регулярное выражение, было бы более кратким и читабельным.

1 голос
/ 28 октября 2009

Это определенно не то, что вы, кажется, хотите. Метод include? принимает String, а не "apples" or "banana" or "cheese". Попробуйте вместо этого:

puts "yay" if ["apples", "banana", "cheese"].include?(step)

Но из контекста неясно, каким должен быть шаг. Если это всего лишь одно слово, тогда это нормально. Если это может быть целое предложение, попробуйте ответ joel.neely.

0 голосов
/ 28 октября 2009

Просто чтобы добавить еще одну сторону к этому ...

Если step равно или Array (как подсказывает include?, то, возможно, код должен быть:

if (step - %w{apples banana cheese}) != step
  puts 'yay'
end
0 голосов
/ 28 октября 2009

Я добавлю несколько скобок для вас:

if (step.include? "apples") or ("banana") or ("cheese")
    say "yay"
end

(Вот почему он всегда говорит "yay" - потому что выражение всегда будет истинным.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...