检查答案是否为空
我想为用户创建一个循环,直到他给我一个数字。 但我不知道检查它是数字还是字符串的正确方法。 这样的事情。
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/) #=> []