Ruby 所以我希望用户的答案只包括0到9的数字。。我该怎么做?

Ruby 所以我希望用户的答案只包括0到9的数字。。我该怎么做?,ruby,Ruby,正如我在标题中所要求的那样。当用户输入了一些只包含数字的值时,我如何创建一个中断的循环,如果没有,它会说重试 prompt = "> " puts "What is the salary for the accountant: " print prompt while accountant = gets.chomp if accountant == (0..9) puts "Nice" break el

正如我在标题中所要求的那样。当用户输入了一些只包含数字的值时,我如何创建一个中断的循环,如果没有,它会说重试

prompt = "> "
    puts "What is the salary for the accountant: "
    print prompt 
    while accountant = gets.chomp

      if accountant == (0..9)
        puts "Nice"

        break

      else 
        "try again"
        print prompt
      end 
    end 

      end 

您的问题在这一行:

if accountant == (0..9)
这是检查值是否等于一个范围-这不是您想要的

由于来自
get.chomp
的输入将始终是一个字符串,因此需要检查它是否只包含以下字符:
“0”
“1”
“2”
。。。和
“9”

一种方法是使用正则表达式:

if accountant =~ /\A\d+\z/
  • \A
    表示“字符串开头”
  • \z
    表示“字符串结束”
  • \d+
    表示“一个或多个数字”(0-9)

请注意,您在评论中建议的解决方案,
/^-?[0-9]+$/
,存在缺陷,因为:

  • ^
    表示“行的开始”(因此可以在换行之前插入任意其他字符)
  • $
    表示“行尾”(因此可以在换行后插入任意其他字符)
  • -?
    还允许使用可选连字符。在这种情况下,这可能不是你想要的,因为输入的是工资——当然不能是负的
      一个没有正则表达式的简单解决方案是:

      accountant.chars.all?{|n| ("0".."9") === n}
      
      如果您还不知道Ruby中的“==”操作符是如何工作的,那么您可能想了解它,因为如果您来自PHP或Javascript,它可能会令人困惑。

      现在,您正在比较一个
      字符串
      accountary=gets.chomp
      )和一个
      范围
      (0..9)
      ),这两个范围永远不会相等。你要看的是一个数字是否在范围内,所以
      (0..9)。cover?(accountary.to_i)
      应该适合你
      如果accountary=~/\a\d+\z/
      还请注意,无效答案将转换为零-例如
      “a”。to_i==0
      。因此,正如上面所建议的,正则表达式可能是一种更好的方法。我发现,如果accountary=~/^-?[0-9]+$/使用这个方法,那么允许负工资。可怜的员工:D不管怎样,我会选择
      /\A-?[0-9]+\z/
      或者换行符和非数字匹配的东西。@mudasobwa的建议是好的