Долгий вопрос, но я думаю, что это странно. Я играл с заявлениями о рубине. Создал небольшую функцию fizzbuzz для практики.Заявление оператора Fizzbuzz
Изначально созданный код, как это
def fizzbuzz(start_num, end_num)
fizzbuzz = []
(start_num..end_num).each do |x|
if x % 3 == 0 && x % 5 != 0
fizzbuzz << "fizz"
elsif x % 5 == 0 && x % 3 != 0
fizzbuzz << "buzz"
elsif (x % 3 == 0 && x % 5 == 0)
fizzbuzz << "fizzbuzz"
else
fizzbuzz << x.to_s
end
end
fizzbuzz
end
работ, как и ожидалось. Затем захотелось играть с помощью оператора switch. Так что я пробовал:
def fizzbuzz(start_num, end_num)
fizzbuzz = []
(start_num..end_num).each do |x|
case x
when x % 3 == 0
fizzbuzz << "fizz"
when x % 5 == 0
fizzbuzz << "buzz"
when (x % 3 == 0 && x % 5 == 0)
fizzbuzz << "fizzbuzz"
else
fizzbuzz << x.to_s
end
end
fizzbuzz
конец
На этот раз код выводит только число преобразуется в строку. Тогда по ошибке я пытался добавить & & в конце каждого, когда заявление как так
def fizzbuzz(start_num, end_num)
fizzbuzz = []
(start_num..end_num).each do |x|
case x
when x % 3 == 0 &&
fizzbuzz << "fizz"
when x % 5 == 0 &&
fizzbuzz << "buzz"
when (x % 3 == 0 && x % 5 == 0) &&
fizzbuzz << "fizzbuzz"
else
fizzbuzz << x.to_s
end
end
fizzbuzz
end
Интересно это выводит правильный результат. Это, вероятно, тривиальный ответ, но кто-нибудь знает, почему это так? Мне кажется странным.
Потому что оператор switch выполняет только одну ветвь, и вам нужно, чтобы она ударила несколько. FizzBuzz не является большим вариантом использования для 'case' – Brennan
@Brennan Это не так, но это не проблема. код OP не требует какого-либо провального поведения. Может быть, я не понимаю вашу точку зрения. –
Сначала я неправильно читаю. Это не проблема, и как только исправлено будет работать, но она все еще показывает непонимание того, как эта структура работает.Он не требует * какого-либо пассивного поведения, но он, безусловно, пытается использовать его как таковой. – Brennan