Arrays 鲁比:如何使零再次成为一个数字?包括什么?这个方法看起来很奇怪

Arrays 鲁比:如何使零再次成为一个数字?包括什么?这个方法看起来很奇怪,arrays,ruby,zero,Arrays,Ruby,Zero,情况是这样的。“arr”是从字符串转换而来的数组(我们从用户输入中获取该字符串)。这段代码正在检查“arr”中是否有零,但它的行为非常奇怪。如果用户输入类似“123q”的内容,即使没有零,也会打印此消息。当然,如果输入是“1230”,它就可以正常工作。我找不到任何关于这方面的信息,但我花了相当多的时间进行研究 还有更多。 另一段代码,但与我的问题密切相关 if arr.include?(0) puts "Please, try again. You cannot use zero!"

情况是这样的。“arr”是从字符串转换而来的数组(我们从用户输入中获取该字符串)。这段代码正在检查“arr”中是否有零,但它的行为非常奇怪。如果用户输入类似“123q”的内容,即使没有零,也会打印此消息。当然,如果输入是“1230”,它就可以正常工作。我找不到任何关于这方面的信息,但我花了相当多的时间进行研究

还有更多。 另一段代码,但与我的问题密切相关

  if arr.include?(0)
    puts "Please, try again. You cannot use zero!"
  end
在这种情况下,如果用户输入为“1230”,则仍将打印此消息

问题是:那里到底发生了什么,我该如何解决?我需要这个代码只检查零

鲁比,包括吗?方法似乎认为0也表示所有非数字字符,而不是真正表示自身。0是非数字的吗?我如何使它再次成为一个数字,以便我的“如果”能按我预期的方式工作

另外,我正在使用repl.it(当前的Ruby版本2.3.1p112)来运行代码,没有猴子补丁或类似的东西。

使用这个:

  if string.match(/\D/)
    puts "Please, try again. You cannot use non-numerical characters!"
  end

更新

if '1230'.chars.map(&:to_i).include?(0)
  puts "Please, try again. You cannot use zero!"
end
使用以下命令:

  if string.match(/\D/)
    puts "Please, try again. You cannot use non-numerical characters!"
  end

更新

if '1230'.chars.map(&:to_i).include?(0)
  puts "Please, try again. You cannot use zero!"
end

不要将
字符串
转换为
整数
,它总是导致0

带0:

"rew212340weq232".chars.map {|x| x[/\d+/]}.compact.map(&:to_i)
#=> [2, 1, 2, 3, 4, 0, 2, 3, 2]
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:

"rew212340weq232".chars.map {|x| x[/\d+/]}.compact.map(&:to_i)
#=> [2, 1, 2, 3, 4, 0, 2, 3, 2]
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'或0
,并打印语句不要将
字符串
转换为
整数
,它总是会导致0

带0:

"rew212340weq232".chars.map {|x| x[/\d+/]}.compact.map(&:to_i)
#=> [2, 1, 2, 3, 4, 0, 2, 3, 2]
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:

"rew212340weq232".chars.map {|x| x[/\d+/]}.compact.map(&:to_i)
#=> [2, 1, 2, 3, 4, 0, 2, 3, 2]
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'或0
,然后打印语句您的输入可能不是
'1230'
,而是
“1230\n”
,并且
/\D/
匹配
“\n”

您可以使用删除尾随的换行符,并编写一个正则表达式来检查是否只有数字而没有
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

您的输入可能不是
“1230”
,而是
“1230\n”
,并且
/\D/
匹配
“\n”

您可以使用删除尾随的换行符,并编写一个正则表达式来检查是否只有数字而没有
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

正如其他人所说,问题在于
String#to_i
对于非数值返回
0

解决此问题的一个更简单的方法是根本不将用户输入拆分为数组,而只是使用正则表达式,就像您在第二个代码示例中所做的那样:

input.chomp =~ /\A[1-9]+\z/

此外,它还是一个测试正则表达式的好网站<代码>'1234'与
/\D/
不匹配,因此您的实现可能有问题。

正如其他人所述,问题是
String#to_i
对于非数值返回
0

解决此问题的一个更简单的方法是根本不将用户输入拆分为数组,而只是使用正则表达式,就像您在第二个代码示例中所做的那样:

input.chomp =~ /\A[1-9]+\z/


此外,它还是一个测试正则表达式的好网站
'1234'
/\D/
不匹配,因此您的实现可能有问题。

如何将用户输入转换为数组?arr=gets.chomp.split(“”)。map{el | el.to_i}当您将纯字母字符串(如
'q'
转换为整数时,您将得到
0
。如何将用户输入转换为数组?arr=gets.chomp.split(“”.map{| el | el.to_i}当您将纯字母字符串(如
'q'
转换为整数时,您会得到
0
)。第二个是我已经在用的东西。我想我应该提一下,对不起。但是,它并没有按预期的方式工作。正如注释中提到的,
'q'。to_i
会导致
0
。不要将其转换为int,而是检查
'0'
。查看更新的答案不幸的是,我必须找到一种解决方法,因为我真的需要将它们转换为int。谢谢你的帮助!非常漂亮的非常感谢你。这就是我需要的。第二个是我已经在用的东西。我想我应该提一下,对不起。但是,它并没有按预期的方式工作。正如注释中提到的,
'q'。to_i
会导致
0
。不要将其转换为int,而是检查
'0'
。查看更新的答案不幸的是,我必须找到一种解决方法,因为我真的需要将它们转换为int。谢谢你的帮助!非常漂亮的非常感谢你。这就是我所需要的。我把他的代码转换成一个数组,即使没有地图也可以完成。只是为了确保他不使用
来定义上面注释中解释的映射值,以便提问者更清楚。如果你看到提问者的一条评论,他使用map将
字符串
转换为
整数。
。我从地图上删除了整数转换,这样他就可以看到我所做的更改。无论如何,如果这没有意义,我会改变它。谢谢。:)太好了。非常感谢。我用他的代码将一个句子转换成一个数组,这样即使没有地图也可以完成。只是为了确保他不使用
将上面注释中解释的映射值转换为
,以便提问者更清楚。如果你看到提问者的其中一条评论,他使用map将
字符串
转换为
整数。
。我从地图上删除了整数转换,这样他就可以看到我所做的更改。无论如何,如果这没有意义,我会改变它。谢谢。:)太好了。非常感谢,好的,谢谢。我已经使用了
chomp
,似乎没有问题。好的,谢谢。我已经使用了
chomp
,这似乎不是问题所在。