if arr.include?(0)
puts "Please, try again. You cannot use zero!"
end
情况是这样的。'arr' 是从字符串转换而来的数组(我们从用户输入中获取该字符串)。这段代码正在检查"arr"中是否有零,但它的行为真的很奇怪。如果用户输入类似"123q"的内容,即使没有零,也会打印此消息。当然,如果输入是"1230",它就可以了。我找不到任何关于这方面的信息,但我花了相当多的时间进行研究。
还有更多。 另一段代码,但与我的问题密切相关。
if string.match(/D/)
puts "Please, try again. You cannot use non-numerical characters!"
end
在这种情况下,如果用户输入为"1230",仍将打印此消息。
问题是:那里到底发生了什么,我该如何解决?我需要此代码仅检查零。
Ruby .include? 方法似乎认为 0 也代表所有非数字字符,并不真正代表自身。0 是非数字吗?我如何再次将其设为数字,以便我的"如果"按照我预期的方式工作?
附言我正在使用 repl.it(当前的 Ruby 版本 2.3.1p112)来运行代码,并且没有猴子补丁或类似的东西。
您的输入可能不是'1230'
而是"1230n"
,并且/D/
与"n"
匹配。
您可以使用chomp
删除尾随换行符,并编写单个正则表达式来检查是否只有数字但没有0
:
input.chomp =~ /A[1-9]+z/
使用这个:
if '123q'.chars.include?('0')
puts "Please, try again. You cannot use zero!"
end
或
if '1230'.chars.map(&:to_i).include?(0)
puts "Please, try again. You cannot use zero!"
end
更新
"rew212340weq232".chars.map {|x| x[/d+/]}.compact.map(&:to_i)
#=> [2, 1, 2, 3, 4, 0, 2, 3, 2]
不要将string
转换为integer
,它总是导致 0
使用 0:
arr = "asds sad deff 0".chomp.split("")
if (arr.include?(0) || arr.include?('0'))
puts "Please, try again. You cannot use zero!"
end
result===> Please, try again. You cannot use zero!
如果没有 0:
arr2 = "asds sad deff".chomp.split("")
if (arr2.include?(0) || arr2.include?('0'))
puts "Please, try again. You cannot use zero!"
end
result===> nil
您可以测试数组中的'0' or 0
并打印语句
正如其他人所说,问题是String#to_i
返回非数字值的0
。
解决此问题的更简单方法是根本不将用户输入拆分为数组,而只需使用正则表达式,就像您在第二个代码示例中所做的那样:
loop do
puts(defined?(user_input) ? 'Please enter a value:' : 'No zeroes allowed! Please try again:')
user_input = gets.chomp
break unless user_input.match(/0/)
end
此外,http://rubular.com 是测试正则表达式的好网站。'1234'
不匹配/D/
,因此您的实现可能有问题。