2016-08-19 9 views
2

ここで長いコードはw/cはbegin-endブロックとif文の両方の組み合わせです。 if文でどのように単純化できますか?Ruby文を簡略化

print "Put a number between 0 to 100: " 

begin 
numb = gets.chomp 
numb = Integer(numb) 
rescue 
    print "Please put a number not a text: " 
    retry 
end 

if numb < 0 
    puts "You can't enter a negative number!" 
elsif numb <= 50 
    puts "#{numb} is between 0 and 50" 
elsif numb <= 100 
    puts "#{numb} is between 51 and 100" 
else 
    puts "#{numb} is above 100" 
end 

リファクタリング

+0

私は多分代わりに 'case'を試してみてください、あなたはここで行うことができない何かを見ていない?しかし、それはの面でelse'場合'と同じ見られます行数。 – Surya

+0

'retry'はあなたの' begin/end'ブロックをループに変えます。これはあなたの 'if' /' elsif'式が動作する方法とはまったく異なります。 – Stefan

+5

コードのレビューと改善の要求がよりよく合うかもしれないので、この質問を議論の対象外とすることにしました。http://codereview.stackexchange.com/ –

答えて

2

あなたが救出したい例外クラスを指定することをお勧めします。その場合、それはArgumentErrorです。

さらに、あなたのコードは大丈夫です。 読む入力メソッドに抽象化することができます

def read_input 
    Integer(gets.chomp) 
rescue ArgumentError 
    print "Please put a number not a text: " 
    retry 
end 

あなたのコードの第二部では、唯一のものはputsは、すべてのケースでputsを入力して回避するために、ifの前に移動することができることです。コードの一部が、他の範囲およびおそらくより読みやすいcase文で表すことができること

print "Put a number between 0 to 100: " 
numb = read_input 
puts if numb < 0 
    "You can't enter a negative number!" 
elsif numb <= 50 
    "#{numb} is between 0 and 50" 
elsif numb <= 100 
    "#{numb} is between 51 and 100" 
else 
    "#{numb} is above 100" 
end 

さらに
puts case numb 
    when -Float::INFINITY...0 then "You can't enter a negative number!" 
    when 0..50 then "#{numb} is between 0 and 50" 
    when 51..100 then "#{numb} is between 51 and 100" 
    else "#{numb} is above 100" 
end 

-Float::INFINITY...0ステートメントはproc(&:negative?)によって表現することができます。 Numeric#positive?およびNumeric#negative?のメソッドは、Ruby sice 2.3バージョンで使用できます。

+0

'read_input'を再帰的に呼び出すのではなく、' retry'を保つ必要があります。 – Stefan

+0

理由を説明できますか?読みやすさ、ベストプラクティス、パフォーマンス、または多分何か他のもののためですか? – maicher

+1

Rubyはテール再帰呼び出しを認識しません。したがって、各コールはコールスタックにプッシュされます。いくつかの無効な数字を入力してControl-Cを押すと(プログラムを終了し、現在のバックトレースを表示する)、これを見ることができます。さて、もう一度 '再試行 'をして、バックトレースを比較してみてください。 – Stefan

0

は、あなたが不要倍増引用符を変更することができますcode styleルビーによると

Youl shouldn't rescue Exception

print 'Put a number between 0 to 100: ' 

begin 
    numb = Integer(gets.chomp) 
rescue ArgumentError 
    print 'Please put a number not a text:' 
    retry 
end 

case numb 
when -Float::INFINITY...0 
    'You can\'t enter a negative number!' 
when 0..50 
    "#{numb} is between 0 and 50" 
when 51..100 
    "#{numb} is between 51 and 100" 
else 
    "#{numb} is above 100" 
end 

を試してみてください。 (rubocop宝石を見てください)

そして、それ以外の場合はいつ変更しますか?

+0

最後の点は正しいが、OPは「例外」を救済しなかった。 – Stefan

0

case文を使用するか、整数をチェックするための制限を格納している変数に基づいてチェックを実装することが多すぎる場合です。

以下のコードは、初期コード、caseステートメント、および制限を格納する配列で、最も適切な解決策を得るまで、同じことを3回行います。

(1..7).each { 
    print "Put a number between 0 to 100: " 

    begin 
    numb = gets.chomp 
    numb = Integer(numb) 
    rescue 
    print "Please put a number not a text: " 
    retry 
    end 

    if numb < 0 
     puts "You can't enter a negative number!" 
    elsif numb <= 50 
     puts "#{numb} is between 0 and 50" 
    elsif numb <= 100 
     puts "#{numb} is between 51 and 100" 
    else 
     puts "#{numb} is above 100" 
    end 

    case 
    when numb < 0 
     puts "[case] You can't enter a negative number!" 
    when numb.between?(0, 50) 
     puts "[case] #{numb} is between 0 and 50" 
    when numb.between?(51, 100) 
     puts "[case] #{numb} is between 51 and 100" 
    when numb > 100 
     puts "[case] #{numb} is above 100" 
    end 

    lim = [100, 0, 50].sort 
    if (numb < lim.first) 
    puts "[limit list] You can't enter a negative number!" 
    elsif (numb > lim.last) 
     puts "[limit list] #{numb} is above #{lim.last}" 
    else 
    (lim.first lim.size - 1).each_index { |i| 
     min_value = lim[i].eql?(0) ? 0 : lim[i]+1 
     if numb.between?(min_value,lim[i+1]) 
     puts "[limit list] #{numb} is between #{min_value} and #{lim[i+1]}" 
     break 
     end 
    } 
    end 
    puts 
} 

出力:

Put a number between 0 to 100: -3 
You can't enter a negative number! 
[case] You can't enter a negative number! 
[limit list] You can't enter a negative number! 

Put a number between 0 to 100: 0 
0 is between 0 and 50 
[case] 0 is between 0 and 50 
[limit list] 0 is between 0 and 50 

Put a number between 0 to 100: 42 
42 is between 0 and 50 
[case] 42 is between 0 and 50 
[limit list] 42 is between 0 and 50 

Put a number between 0 to 100: 50 
50 is between 0 and 50 
[case] 50 is between 0 and 50 
[limit list] 50 is between 0 and 50 

Put a number between 0 to 100: 84 
84 is between 51 and 100 
[case] 84 is between 51 and 100 
[limit list] 84 is between 51 and 100 

Put a number between 0 to 100: 100 
100 is between 51 and 100 
[case] 100 is between 51 and 100 
[limit list] 100 is between 51 and 100 

Put a number between 0 to 100: 168 
168 is above 100 
[case] 168 is above 100 
[limit list] 168 is above 100