问题描述
有没有办法组合这两个代码块以减少冗余?
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
解决方法
您可以按照以下步骤进行操作。
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
以外的其他东西进行循环。