【问题标题】:conditional statements to only accept integer as an input Ruby仅接受整数作为输入 Ruby 的条件语句
【发布时间】:2020-02-21 06:02:36
【问题描述】:

我编写了一个代码,它向多个人提出问题,每个人的回答都被放入哈希中。这是一个循环,看起来像这样

arr:[]
     (1..n).each do |i|

 hash=Hash.new()

 puts "Please input a value for day # #{i}" 
 hash["day1"]=gets.chomp.to_f

 puts "Please input a value for day # #{i}" 
 hash["day2"]=gets.chomp.to_f

 arr << hash
 end 

所以为了避免任何不正确的输入(即输入字符串而不是整数/数字),我需要放置一个条件语句。 我对如何做到这一点感到非常迷茫,因为我在接受用户输入的同时将用户的输入分配到哈希中。 是否有可能做到这一点,或者我应该完全采取不同的路线。

谢谢

【问题讨论】:

  • 你想要的是hash["day1"]= Integer(gets) rescue nil
  • 我不是 100% 清楚这个问题,但听起来你在问如何访问在哈希中输入的值?将密钥分配给用户输入后,您可以通过相同的密钥重新访问它,例如 if hash["day1"] == 'some_value'
  • 请参阅“How to Ask”以及链接页面和“mcve”。由于错误,您的代码将无法运行。
  • 你的问题解决了吗?

标签: ruby loops conditional-statements


【解决方案1】:

您可以获得如下所示的日期值。当输入一个数字以外的字符时,它会再次询问当天的值。

puts 'Enter number of days'
days_hash = {}
number_of_days = gets.chomp.to_i
day = 1

while day <= number_of_days
  puts "Please enter a value for day # #{day}" 
  input = gets.chomp
  if input !~ /\D/
    days_hash["day#{day}"] = input.to_i
    day += 1
  else
    puts "Please enter only number"
    next
  end
end

p days_hash
#=> { "day1" => 2, "day2" => 4, "day3" => 8 }
days_hash['day2']
#=> 4

【讨论】:

    【解决方案2】:

    也许您可以考虑使用这种通用方法来验证用户输入,请注意此示例 require 'date'

    因此,您可以检查用户输入是否为整数、浮点数或格式化日期或任何您可以添加的内容...


    首先定义一个问题数组,其中包含问题文本、验证方法和转换输入的方式,如下所示:
    questions = [
                  {text: "Enter an integer:", validate: :must_be_an_integer, convert: :my_to_i},
                  {text: "Enter a float:", validate: :must_be_a_float, convert: :my_to_f},
                  {text: "Enter a data as d-m-yyyy", validate: :must_be_a_formatted_date, convert: :to_formatted_date}
                 ]
    


    然后定义:validate键调用的一些方法,用于用户输入验证:
    def must_be_an_integer(num)
      Integer(num).class == Integer rescue false
    end
    
    def must_be_a_float(num)
      Float(num).class == Float && num.include?('.') rescue false
    end
    
    def must_be_a_formatted_date(date_str)
      date = Date.strptime(date_str, "%d-%m-%Y") rescue false
      return false unless date
      date.year <= 9999 && date.year >= 1000
    end
    


    还定义键 :convert 所需的方法(需要传递一个参数,这就是 my_to_imy_to_f 的原因):
    def my_to_i(num)
      num.to_i
    end
    
    def my_to_f(num)
      num.to_f
    end
    
    def to_formatted_date(date_str)
      DateTime.strptime(date_str, "%d-%m-%y")
    end
    


    最后遍历问题:
    res = questions.map do |question|
      answer = nil
      3.times do
        puts question[:text]
        u_input = gets.chomp
        if send question[:validate], u_input
          answer = send question[:convert], u_input
          break
        end
      end
      if answer.nil?
        puts "C'mon man! Check your keyboard!" # after three input errors!!
        break
      end
      { question: question[:text], answer: answer }
    end
    


    结果示例:
    #=> [
         {:question=>"Enter an integer:", :answer=>1},
         {:question=>"Enter a float:", :answer=>1.1},
         {:question=>"Enter a data as d-m-Y", :answer=>#<DateTime: 2020-10-27T00:00:00+00:00 ((2459150j,0s,0n),+0s,2299161j)>}
        ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-04
      • 2021-05-02
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2019-07-24
      • 2016-06-24
      相关资源
      最近更新 更多