【问题标题】: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#IntegerKernel#loop。在 Ruby v2.6 中,Kernel#Integer 被赋予了可选参数 exception: false

    使用loop 的一个优点是它提供了一定程度的数据封装。与whileuntil 不同,loop 采用一个块,从而使窥探者远离块内定义的局部变量的值。我很少使用loop 以外的任何东西进行循环。

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 2016-05-30
      • 1970-01-01
      • 2021-04-25
      • 2020-12-16
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多