2016-09-23 6 views
1

Я довольно новичок в коде, и у меня есть быстрый вопрос о условностях Ruby, в частности Case Expressions. У меня есть метод, в котором я хочу вернуть строку «odd», если длина строки нечетна и «четна», если длина строки четная.Ruby Conditionals/Case Expression

Простые материалы, которые я знаю, и я могу получить результаты с использованием условного выражения if/else, однако выражение case просто возвращает «nil». Любая помощь будет принята с благодарностью.

def odd_or_even(string) 
    case string 
    when string.length.even? then "even" 
    when string.length.odd? then "odd" 
    end 
end 

odd_or_even("Ruby") # Wanting to return even rather than nil 
odd_or_even("Rails") # Wanting to return odd rather than nil 
+0

Возможный дубликат [Ярлык, чтобы сделать случай/переключатель вернул значение] (http://stackoverflow.com/questions/20671307/shortcut-to-make-case-switch-return-a-value) – Tutleman

ответ

5

Вы написали свое заявление case неправильно. Он принимает две формы, что необычно по сравнению с другими языками. Первая форма принимает аргумент, и этот аргумент сравнивается со всеми возможными случаями. Вторая форма без аргументов, и каждый случай оценивается независимо.

Самое минимальное исправление заключается в следующем:

def odd_or_even(string) 
    case 
    when string.length.even? then "even" 
    when string.length.odd? then "odd" 
    end 
end 

Это потому, что Руби ваш код выглядел следующим образом при вызове с аргументом «Рубин»:

def odd_or_even(string) 
    case string 
    when true then "even" 
    when false then "odd" 
    end 
end 

Ваше значение string не совпадает true или false, так что вы получите nil из ситуации несоответствия.

Вы можете значительно сократить ваш код. Подумайте: может ли быть что-то даже не и не странно? Не совсем:

def odd_or_even(string) 
    string.length.even? ? 'even' : 'odd' 
end 
+0

Благодарим вас @tadman. Я очень ценю ваше время и отзывы. – HeresJohnny5

+0

HeresJohnny5, ваш код сработал бы, если бы вы заменили 'case string.length.even?' На 'case string' выше. Кстати, есть ли по крайней мере пять HeresJohnny's на SO? –

+0

Вот что происходит, когда [вы позволяете роботу выбирать свое имя] (https: //en.wikipedia.org/wiki/Short_Circuit_ \ (1986_film \)). Мне нравится mashup между Carson, (King?) И * Short Circuit *. – tadman

0
case something 
    when condition1 
    expression1 
    when condition2 
    expression2 
    else 
    default_expression 
end 

эквивалентно

if condition1 === something 
    expression1 
elsif condition2 === something 
    expression2 
else 
    default_expression 
end 

case-when Обратите внимание, что внутренне использует ===, оператор (метод), который может быть переопределен.