我正在尝试循环此问题,直到用户输入为字符串值:
问题:你叫什么名字?
- 我不希望用户只按Enter键并将名称留空。
- 我不希望用户的输入为数字/数字。
请参阅下面的代码:
name1 = gets.chomp.to_s
loop do
print "Please enter your name "
name1 = gets.chomp.to_s
if name1.empty?
puts "No input."
else name1.to_i
puts "Illegal character ':'"
end
end
使用此代码,即使输入字符串值,也无法继续处理下一个问题。请帮忙。
答案 0 :(得分:2)
您的代码有几个问题:
您的输入和输出无序。您在提示之前收集输入,并且从未使用过输入(从第一行开始):
name1 = gets.chomp.to_s # <- Ruby is waiting for input
loop do
print "Please enter your name " # <- user is prompted to enter name
name1 = gets.chomp.to_s # <- previous input is overwritten
# ...
end
第一行应该删除。
您的if-else
构造实际上是:
if name1.empty?
puts "No input."
else
name1.to_i
puts "Illegal character ':'"
end
因此,只要输入不是empty?
,就会将其转换为整数(丢弃结果)并打印错误消息。您可能需要elsif
代替/.../
是regexp而\d
匹配数字):
if name1.empty?
puts 'No input.'
elsif name1.match? /\d/
puts 'Digits not allowed.'
end
您还可以使用case
expression:
case name1
when ''
puts 'No input.'
when /\d/
puts 'Digits not allowed.'
end
您永远不会突破loop
。即使没有发现错误,代码也会保持循环。这可以通过在else
分支(if
或case
)中添加break
statement来解决:
# ...
else
break
end
答案 1 :(得分:-1)
gets.chomp
将始终返回一个字符串,因此无需在方法上调用to_s
。
如果您不希望用户能够输入任何整数,您可以使用以下内容获得清洁解决方案:
name.count("0-9") > 0
如果这返回true
,那么您知道用户的输入包含至少一个数字。