Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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_User Input - Fatal编程技术网

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

Ruby 如何强制/检查用户输入所需的日期类型,ruby,user-input,Ruby,User Input,如何编写代码,让用户输入特定的值类型(如int),然后强制或循环一个提示,直到用户输入int,而不是字符串或带有字符串的数字?我正在考虑使用for或while循环的某种类型的布尔值。让我们从一些基础知识开始。将其放入一个文件userinput.rb: print "Please enter a number: " input = gets puts input 然后使用ruby userinput.rb运行。您将得到一个提示,程序将输出您键入的任何内容 您希望输入为整数,因此让我们使用inte

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

让我们从一些基础知识开始。将其放入一个文件
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=Integer(gets)rescue nil
,它转换整数,并且在出现类似上述
ArgumentError
的情况下,错误被解救,并且
input
var再次为nil

更详细的编写方法(除了只捕获
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
一些注意事项:

  • 请不要被和弄糊涂
    Integer
    是也封装大数字的父类,但是测试
    Fixnum
    是相当标准的(就像在循环头中一样)。您也可以只使用
    。is_是?(整数)
    ,而不更改行为
  • 大多数Ruby教程可能使用
    置于
    打印
    之上,后者的输出不会以换行结束,这会使提示显示在一行中

  • 欢迎来到stackoverflow。请说明您尝试了什么,哪些方法不起作用(例如错误消息,哪些方法不起作用,…),以及您尝试解决问题的方法。请用附加信息编辑您的问题。非常感谢,非常有用。在rescue nil之前,我并不真正理解fixnum的代码,您是否建议我在某个地方进行阅读,以便更好地掌握till循环和fixnum。此外,还可以在integer类中使用gets方法?
    gets
    只是一个始终返回字符串的方法。如果输入
    asdf
    ,它将调用
    Integer(“asdf”)
    ,如果输入像
    23
    这样的数字,它将调用
    Integer(“23”)
    Integer()
    部分不是类而是函数。我很清楚这一定会让人困惑,我建议您运行
    irb
    ,并在提示中玩一玩,以获得概念。请看下面的内容:我还建议您阅读Ruby中的循环,谷歌搜索会让您在这里走得更远。我编辑了我的答案,给出了一个更详细的例子。我明白了。本质上,您是在integer方法内部使用gets方法。那么,究竟是什么使“Fixnum”成为一个类呢?我很难理解ruby语言的结构。你有skype吗?请添加我或用户名:jarggsx
    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