将多个用户输入保存为变量之前,请检查是否满足特定条件

问题描述

有没有办法组合这两个代码块以减少冗余?

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#IntegerKernel#loop。 Ruby v2.6为Kernel#Integer提供了可选参数exception: false

使用loop的一个优点是它提供了一定程度的数据封装。与whileuntil不同的是,loop占用了一个块,从而将视线从该块中定义的局部变量的值中移开。我很少使用loop以外的其他东西进行循环。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...