2016-09-23 11 views
1

私はコードが新しく、Rubyの条件式、具体的にはケース式について簡単に質問しています。文字列の長さが奇数の場合は文字列 "odd"を返し、文字列の長さが偶数の場合は "even"を返すメソッドがあります。Ruby条件式/ケース式

私が知っている単純なもの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文を書きました。それは他の言語に比べて珍しい2つの形式をとります。最初の形式は引数をとり、その引数はすべての可能な場合と比較されます。 2番目の形式は引数なしであり、それぞれの場合が独立して評価されます。

最も最小限の修正はこれです:

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

引数「ルビー」を呼び出すときにこれが原因でのRubyにあなたのコードはこのように見えた。

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'に' case string.length.even? 'を代入していれば、あなたのコードはうまくいっていました。 btw、本当に少なくとも5人のHeresJohnnyがいるのですか? –

+0

[ロボットが自分の名前を選ぶようにする](https://en.wikipedia.org/wiki/Short_Circuit_ \(1986_film \))の場合はどうなりますか。私はカーソン(キング?)と*ショートサーキットのマッシュアップが好きです。 – tadman

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

case-whenが内部===を使用していることを

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

注意、上書きすることができます演算子(メソッド)と同等です。