2016-11-30 13 views
2

整数との比較:渡すときCaseステートメントと私はルビーと初心者だと、それはこの場合文でこのように動作し、なぜ私にはわからない

def evaluate(number) 
    case 
    when number<0 
    puts "#{number} is negative" 
    when 0..50 
    puts "#{number} is between 0 and 51" 
    when 51..100 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 

    number = gets.chomp.to_i 

    puts evaluate(number) 

-4例えば、それは動作しますが、場合I再はありますより大きい100

で他だったとを出力したかのように負の値を解釈し

def evaluate(number) 
    case number 
    when number<0 ... 

その後、ケースに番号を追加それのためのason?誰かが私を助けることができれば、とても感謝しています。

+0

このコードは、いくつかの 'end'ステートメントが欠けているように、不完全に見えます。字下げで十分ですが、Pythonに使用されていますか? – tadman

答えて

5

これを試してみてください。

def evaluate(number) 
    case number 
    when -Float::INFINITY...0 
    puts "#{number} is negative" 
    when 0..50 
    puts "#{number} is between 0 and 51" 
    when 51..100 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 
    end 
end 

puts evaluate(-43) 
# -43 is negative 
puts evaluate(0) 
# 0 is between 0 and 51 
puts evaluate(27) 
# 27 is between 0 and 51 
puts evaluate(100) 
# 100 is between 51 and 100 
puts evaluate(9999) 
# 9999 is greater than 100 

case文は比較に===を使用しているためまた、あなたが効果的に上記の最初のcase文で起こっていることである

def evaluate(number) 
    case 
    when number < 0 
    puts "#{number} is negative" 
    when (0..50) === number 
    puts "#{number} is between 0 and 51" 
    when (51..100) === number 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 
    end 
end 

を書くことができます。

Range#===を参照してください。 "obj [引数]が範囲の要素であれば真を返し、そうでない場合は偽を返します。"換言すれば、(1..10) === number(1..10).include?(number)の場合にのみtrueとなります。

私はこの代替手段を主張していません。ケースステートメントで何が起こっているのかを示すのに役立ちました。以下は私がよく読むと思う一つの選択肢です。

def evaluate(number) 
    case 
    when number < 0 
    puts "#{number} is negative" 
    when number <= 50 
    puts "#{number} is between 0 and 51" 
    when number <= 100 
    puts "#{number} is between 51 and 100" 
    else 
    puts "#{number} is greater than 100" 
    end 
end 
+2

トリプルイコールの代わりに、 '(x..y).include?(z)'はどうでしょうか?それはArray、Setなどで動作するので、より一般的なパターンです。 – tadman

+0

@tadman、私は同意し、 'Range#==='の文書に関連して:(1..10)=== number'は '(1..10)ならば真となります。 ?(number) 'を含みます。もちろん、それを使うことができます。 –

+0

ありがとうございます!どちらもうまく動作しますが、最後の方が良いと思います。私は勉強し続けます – Ima

関連する問題