如何强制/检查用户输入所需的日期类型

时间:2014-03-12 07:35:16

标签: ruby user-input

如何编写代码以便用户输入某个值类型(如int),然后强制或循环提示,直到用户输入int,而不是字符串或带字符串字符的数字?我正在考虑使用for或while循环的某种类型的布尔值。

1 个答案:

答案 0 :(得分:2)

让我们从一些基础知识开始。将其放入文件userinput.rb

print "Please enter a number: "
input = gets
puts input

然后使用ruby userinput.rb运行。您会收到提示,程序会输出您键入的内容。

您希望输入为整数,因此我们使用Integer()转换输入:

print "Please enter a number: "
input = gets
puts Integer(input)

输入一个整数,您将获得整数输出。输入其他任何内容,您就会得到类似的内容:

userinput.rb:3:in `Integer': invalid value for Integer(): "asdf\n" (ArgumentError)
        from userinput.rb:3:in `<main>'

现在,您可以构建一个循环,提示用户输入整数:

input = nil # initialize the variable so you can invoke methods on it
until input.is_a?(Fixnum) do
  print "Please enter a number: "
  input = Integer(gets) rescue nil
end

有趣的部分是input = Integer(gets) rescue nil,它转换整数,如果是ArgumentError,如上所述,错误得到拯救,input var再次为零。

更详细的编写方式(除了只捕获ArgumentError例外)将是:

input = nil # initialize the variable so you can invoke methods on it
until input.is_a?(Fixnum) do
  print "Please enter a number: "
  begin
    input = Integer(gets)
  rescue ArgumentError # calling Integer with a string argument raises this
    input = nil        # explicitly reset input so the loop is re-entered
  end
end

一些注意事项:

  1. 请不要对IntegerFixnum感到困惑。 Integer是也包含大数字的父类,但它是测试Fixnum的相当标准(如在循环头中)。您也可以在不改变行为的情况下使用.is_a?(Integer)
  2. 大多数Ruby教程可能使用puts而不是print,后者的输出不会以换行结束,这会使提示出现在一行中。