我正在与Ruby练习一点,我想处理年龄的输入,例如,如果某人类型"十一"而不是11,我想显示一条消息,即知道他/她不能使用弦。
这是我的代码
saludo = "Hola ¿Como te llamas?"
puts saludo
STDOUT.flush
#STDOUT es una constante global que almacena las salidas del programa. flush vacía cualquier dato almacenado, y por lo tanto, limpiará cualquier resultado anterior.
nombre = gets
STDOUT.flush
puts "Entonces te llamas #{nombre}"
puts "¿Cuantos años tienes?"
edad = Integer(gets.chomp)
#gets.chomp elimina el /n de gets
#El .to_i pasa el String a Integer
if edad > 0
if edad >= 18
puts "Eres mayor de edad, puedes votar y esas cosas"
else
puts "Tienes que moverte con el permiso de tus padres."
end
else
puts "prueba"
end
我一直这样做。在String
类中添加一种方法来进行检查使事情变得容易得多。
class String
def is_i?
!!Integer(self)
rescue ArgumentError, TypeError
false
end
end
puts "1".is_i?
puts "asda".is_i?
有些人可能不喜欢它,因为它使用了例外,但我认为它很好。
如果要检查输入的数据类型,则可以使用类似的内容:
input = gets.chomp
input.class == Fixnum
由于Ruby中的每个输入都被视为字符串,您可以使用to_i
将输入转换为Integer,例如:
input = gets.to_i
检查输入值是否为0,这是字符串转换为整数所取的默认值:
if input == 0
puts("Please enter an integer")
如果您使用的是gets
并且希望收到一个数字,将其解析为整数,则可以"跳过" chomp
,这样使用gets.to_i
,您可以从整数中的用户,您可以看到所有不是数字转换为 0
的所有内容,因此您可以检查操作后的edad
是否为0 edad.zero?
,并且这样可以显示您的消息:
puts '¿Cuantos años tienes?'
edad = gets.to_i
if edad.zero?
puts 'Debes ingresar un número'
end
您可以将edad
初始化为0,然后使用until
创建一个循环,该循环要求用户输入一个数字,因此,当edad
获取非零值时,until
循环的代码出现,您可以通过下一步:
edad = 0
until !edad.zero?
puts '¿Cuantos años tienes?'
edad = gets.to_i
if edad.zero?
puts 'Debes ingresar un número'
end
end
puts edad
如果您进行Integer(gets.chomp)
如果gets.chomp
不是严格的整数字符串(即1、2,-12等(,它将引起错误
因此您可以这样做:
input_string = gets.chomp
edad = nil
begin
edad = Integer(input_string)
rescue
puts "#{input_string} is not an integer"
end
# edad will still be nil if there was a problem
input = gets.chomp
if input != "0" && input.to_i == 0
puts "Invalid age format. Integer expected"
else
age = input.to_i
end
更红宝石的方式
使用 case-expression 它允许您将输入与字符串式比较,从而否定了使用String#to_i
的需求:
#age.rb
loop do
puts 'Enter age'
case gets.chomp
when /D/
puts 'Digits only, try again', '======================'
when '0'..'17'
puts 'too young'
break
when '18'..'120'
puts 'old enough'
break
else
puts 'Invalid age, try again', '======================'
end
end
使用Kernel#loop
确保您继续向用户询问输入,直到他们进入有效年龄为止。有效年龄在案例表达中定义为0 - 120
。如果输入有效的年龄,则用break
打破循环。
运行代码
$ ruby age.rb
Enter age
eleven
#Digits only, try again
#======================
Enter age
10000
#Invalid age, try again
#======================
Enter age
5
#too young
$ ruby vote.rb
Enter age
35
#old enough