2013-12-19 4 views
4

Я уверен, что я видел, кто-то делать технику быстрого доступа, как приведенный ниже код (который не работает)Ярлык, чтобы сделать случай/переключатель возвращает значение

return case guess 
    when guess > @answer then :high 
    when guess < @answer then :low 
    else :correct 
end 

Кто-нибудь знает трюк я ссылаясь на?

+1

Просто для удовольствия , вы также можете сказать '{-1 =>: low, 0 =>: correct, 1 =>: high} [guess <=> @answer]'. –

+0

Это выглядит как безумие. Я попробую это скоро. Благодарю. – dwilbank

+0

Да, я не рекомендую вам делать это в реальной жизни, поэтому я не включил его в свой ответ. –

ответ

4

Это работает:

return case 
    when guess > @answer ; :high 
    when guess < @answer ; :low 
    else ; :correct 
    end 
+0

действительно так и есть. Это был не совсем трюк, который я видел раньше, но это так же хорошо! Благодарю. – dwilbank

+0

Вам не нужно ставить точку с запятой после нее. Просто нитпик. –

+0

Операция, необходимая только для удаления слова «угадать» из «case guess». Форма случая, продемонстрированная в этом ответе, список булевых условий, как правило, имеет «затем» вместо «;». см. ответ му. –

5

Вы должны удалить guess из case, потому что это не действительный синтаксис рубин.

Например:

def test value 
    case 
    when value > 3 
    :more_than_3 
    when value < 0 
    :negative 
    else 
    :other 
    end 
end 

Затем

test 2 #=> :other 
test 22 #=> :more_than_3 
test -2 #=> :negative 

return неявно.

Edit: вы можете использовать then если вы тоже нравится, тот же пример будет выглядеть следующим образом:

def test value 
    case 
    when value > 3 then :more_than_3 
    when value < 0 then :negative 
    else :other 
    end 
end 
+0

Um, 'case x, когда y ...' отлично подходит для Ruby. Проблема в том, что существуют две формы «case», а OP путается, о какой из них они используют. –

+0

Да, я имел в виду, что вы не можете использовать его как «случай x, когда x> 2», я виновен в неправильном объяснении – NicoSantangelo

12

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

В Ruby есть две формы: case. Первый из них выглядит следующим образом:

case expr 
when expr1 then ... 
when expr2 then ... 
else ... 
end 

Это будет сравнить expr с when выражения, используя === (это тройка BTW), и он будет выполнять первый then где === дает истинное значение. Например:

case obj 
when Array then do_array_things_to(obj) 
when Hash then do_hash_things_to(obj) 
else raise 'nonsense!' 
end 

такая же, как:

if(Array === obj) 
    do_array_things_to(obj) 
elsif(Hash === obj) 
    do_hash_things_to(obj) 
else 
    raise 'nonsense!' 
end 

Другая форма case это просто набор логических условий:

case 
when expr1 then ... 
when expr2 then ... 
else ... 
end 

Например:

case 
when guess > @answer then :high 
when guess < @answer then :low 
else :correct 
end 

- это то же самое s:

if(guess > @answer) 
    :high 
elsif(guess < @answer) 
    :low 
else 
    :correct 
end 

Вы используете первую форму, когда вы думаете, что вы используете вторую форму, так что вы в конечном итоге делает странные (но синтаксически действительные) вещи, как:

(guess > @answer) === guess 
(guess < @answer) === guess 

В любом случае, , case - это выражение и возвращает все возвращенные ответвления.

+0

Отличный ответ – NicoSantangelo

0

Подобрав на первый комментарий @ Mu по этому вопросу (подход, который выглядит хорошо для меня), вы могли бы, конечно, также пишут, что, как:

return case (guess <=> @answer) 
     when -1 then :low 
     when 0 then :correct 
     when 1 then :high 
     end 

или

 ... 
     else 
     :high 
     end 
Смежные вопросы