【问题标题】:Checking that multiple user inputs meet a certain condition before saving them as variables在将多个用户输入保存为变量之前检查它们是否满足特定条件
【发布时间】:2020-12-23 06:56:09
【问题描述】:
有没有办法将这 2 块代码组合起来以减少冗余?
puts "first number?"
num1 = gets.chomp.to_i
until num1.is_a?(Integer)
puts "please enter an actual number"
num1 = Integer(gets.chomp) rescue nil
end
puts "second number?"
num2 = gets.chomp.to_i
until num2.is_a?(Integer)
puts "please enter an actual number"
num2 = Integer(gets.chomp) rescue nil
end
【问题讨论】:
标签:
ruby
variables
conditional-statements
user-input
rescue
【解决方案1】:
你可以这样做。
def get_int(msg)
puts msg
loop do
n = Integer(gets, exception: false)
break n if n
puts "please enter an actual number"
end
end
num1 = get_int("first number?")
#=> 16
num2 = get_int("second number?")
#=> -4
获取num1 值的对话框如下。
first number?
cat
please enter an actual number
72.1
please enter an actual number
16
获取num2 值的对话框如下。
second number?
&dog
please enter an actual number
10/2
please enter an actual number
-4
见Kernel#Integer 和Kernel#loop。在 Ruby v2.6 中,Kernel#Integer 被赋予了可选参数 exception: false。
使用loop 的一个优点是它提供了一定程度的数据封装。与while 和until 不同,loop 采用一个块,从而使窥探者远离块内定义的局部变量的值。我很少使用loop 以外的任何东西进行循环。