如何编写代码以前置用户输入特定值类型,例如int,然后强制或循环提示,直到用户输入int,而不是字符串或字符串或带有字符串字符的数字?我正在考虑使用或循环时的某种布尔值。
让我们从一些基础知识开始。将其放入文件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(): "asdfn" (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
一些笔记:
- 请不要对
Integer
和Fixnum
感到困惑。Integer
是同样封装大数字的父类,但是测试Fixnum
(如循环头中)是相当标准的。您也可以只使用.is_a?(Integer)
而不改变行为。 - 大多数Ruby教程可能在
print
上使用puts
,后者的输出不会以Newline结束,这使得提示在一行中出现。