ruby - 简化 Ruby 语句

标签 ruby

我这里有一个很长的代码,w/c 是 begin-end block 和 if 语句的组合。如何在 all if 语句中简化此操作?

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

重构

最佳答案

指定要救援的异常类是一个很好的做法。在这种情况下,它是一个 ArgumentError。

此外,您的代码看起来没问题。 读取输入可以抽象为一个方法:

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

在代码的第二部分中,唯一的问题是 puts 可以移到 if 前面,以避免在每个中键入 puts案例。

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

这部分代码也可以用范围和 case 语句来表达,这可以说更具可读性:

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 版本中可用。

关于ruby - 简化 Ruby 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036138/

相关文章:

ruby - 未定义的局部变量或方法 ruby

ruby - 如何在不先保存文本文件的情况下在 Ruby 中使用 FTP

ruby - 认为 ruby​​ 中缺少方法是否可疑?

ruby-on-rails - 在 Rails 中对同一模型列进行两个关联

ruby - 如何使用 Sequel 在 Sinatra 中显示数据库的结果?

ruby - 如何使用 Mechanize 单击按钮进行网页抓取以获取信息?

ruby - 如何让 ruby​​ gems 包含 gem 的所有依赖项,甚至是 BETA 中的依赖项?

ruby - Rubocop MutableConstant 不观察卡住的字符串文字注释

javascript - Trunk8 jquery 插件只 chop 到第一个空格。如何 chop 整个帖子?

html - 在 HTML 页面上循环访问 Ruby 数组中的值