检查答案是否为空

我想为用户创建一个循环,直到他给我一个数字。 但我不知道检查它是数字还是字符串的正确方法。 这样的事情。

puts "Enter your age." age = gets.chomp.to_i while age.empty? age = gets.chomp.to_i end 

空方法导致错误。

使用下面的代码:

 puts "Enter your age." age = Integer(gets.chomp) rescue nil while age.nil? age = Integer(gets.chomp) rescue nil end 

带有关键字break 内核#循环通常用于此类任务。

 r = / \A # match beginning of string [1-9] # match a digit greater than zero \d* # match zero or more digits $ # match end of line /x # free-spacing regex definition mode loop do print "Enter your age: " age = gets[r] break age.to_i unless age.nil? end 

如果输入"34\n" ,则终端中的行将显示如下:

 Enter your age: 34 

请参阅内核#print 。 如果使用Kernel#puts ,将显示以下内容。

 Enter your age: 34 

请注意,第一个锚( \A )匹配字符串的开头,而第二个锚( $ )匹配一行的结尾。 (混合字符串和行锚的开头和结尾是不寻常的。)可以改为写age = gets.chomp[/\A\d+\z/] ,其中\z匹配字符串的结尾。

如果您还需要过滤负整数 ,则可以检查输入是否仅包含数字。 例如:

 age = nil loop do puts "Enter your age: " age = gets.chomp break if (age.scan(/\D/).empty? & !age.empty?) end puts "Your age is #{age}" 

age = nil需要初始化变量并在循环外使用。 或者需要使用@age

.scan(/\D/)生成一个数组,其中包含字符串的每个单个字符,而不是数字\D 因此,如果数组为空,则表示该字符串仅由数字组成。 例如:

 p "my age is 30".scan(/\D/) #=> ["m", "y", " ", "a", "g", "e", " ", "i", "s", " "] p "30".scan(/\D/) #=> []