Ruby:如何再次将零变成数字?包含?方法似乎表现得很奇怪


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/,因此您的实现可能有问题。

相关内容

  • 没有找到相关文章

最新更新