Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 仅接受整数作为输入的条件语句_Ruby_Loops_Conditional Statements - Fatal编程技术网

Ruby 仅接受整数作为输入的条件语句

Ruby 仅接受整数作为输入的条件语句,ruby,loops,conditional-statements,Ruby,Loops,Conditional Statements,我编写了一个代码,其中它询问多个个人的问题,每个人的回答都被放入一个散列中。这是一个循环,看起来像这样 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

我编写了一个代码,其中它询问多个个人的问题,每个人的回答都被放入一个散列中。这是一个循环,看起来像这样

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 
arr:[]
每个人都做|
hash=hash.new()
放入“请为第##{i}天输入一个值”
hash[“day1”]=get.chomp.to\u f
放入“请为第##{i}天输入一个值”
hash[“day2”]=get.chomp.to\u f

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

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
输入“输入天数”
天数\u哈希={}
天数=gets.chomp.to\u i
天=1
而第{“day1”=>2,“day2”=>4,“day3”=>8}
天\u散列['day2']
#=> 4

< /代码> 也许您可以考虑验证用户输入的一般方法,<强>注意本示例代码>需要“日期”<代码> > < /P> 所以,您可以将用户输入检查为整数、浮点、格式化日期或任何您可以添加的内容


首先定义一个包含问题文本、验证方法和转换输入方式的问题数组,如下所示:

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

最后反复回答以下问题:

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)>}
    ]
#=>[
{:问题=>“输入一个整数:”,:答案=>1},
{:问题=>“输入一个浮点:”,:答案=>1.1},
{:问题=>“以d-m-Y的形式输入数据”,:答案=>#}
]

hash[“day1”]=Integer(get)rescue nil是您想要的
?在为该键分配了用户输入后,您可以使用相同的键重新访问它,如
if hash[“day1”]=“some_value”
。请参阅“”以及链接页面和“”。由于出现错误,您的代码无法运行。您的问题解决了吗?
#=> [
     {: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)>}
    ]