2

我正在尝试编写一种方法来获取用户的输入并检查其有效性。它在“案例...何时”声明中。这部分检查用户是否只输入了 Y 或 N。

when 3
    input = gets.chomp.to_s.downcase
    unless input (=="y") || (=="n")
        puts "That is not a valid choice. Please enter Y or N."
        get_input(text, 3)
    end

编译器不喜欢我的布尔语句,我不知道为什么。它告诉我“语法错误,意外 [x]”并指向语句的各个部分。几乎把我的头发扯掉了......我做错了什么明显的错误吗?

4

4 回答 4

4

尝试这个:

unless ['y', 'n'].include?(input)
于 2013-09-18T01:32:16.897 回答
2

根据您来自的语言,您可能会发现这些不同方式中的一种更具吸引力。你可以写:

 unless input (=="y") || (=="n")

作为:

if !input[/^[yn]$/]
    puts "That is not a valid choice. Please enter Y or N."
    get_input(text, 3)
end

或者:

unless input[/^[yn]$/]
  ...
end  

或者:

unless (input == 'y' || input == 'n')
  ...
end

或者:

case input
when 'y', 'n'
  ...
else
  puts "That is not a valid choice. Please enter Y or N."
  get_input(text, 3)
end
于 2013-09-18T01:36:03.247 回答
1

我发现第unless一个不好读。从否定开始在这里会相当不错,但在更复杂的条件下它会失去可读性。

我个人更喜欢

$ if q !~ /[yn]/ # Does NOT match pattern
$   puts "That is not a valid choice. Please enter Y or N."
$   get_input(text, 3)    
$ end

为所有人提供最大的易读性。

于 2013-09-18T01:44:35.950 回答
0

除了使条件正确之外,您的方法似乎还有递归。我怀疑您的方法如下所示:

def get_input(text, option)
  # ...
  case option
  when 1
    # ...
  when 2
    # ...
  when 3
    unless condition
      puts "That is not a valid choice. Please enter Y or N."
      get_input(text, 3) # <- recursion!
    end
  end
  # ...
end

在这里使用循环会更好。像这样的东西:

def get_input(text, option)
  # ...
  case option
  when 3
    loop do
      valid = case gets.chomp
              when /^(y|yes)$/i
                puts "positive input"
                true
              when /^(n|no)$/i
                puts "negative input"
                true
              else
                puts "That is not a valid choice. Please enter Y or N."
                false
              end
      break if valid
    end
  end
end

使用另一个case语句检查输入。如果输入有效(即yn),true则返回并break退出循环,否则false返回,break不调用,循环重新开始。

顺便说一句,(y|yes)匹配yyes(n|no)匹配nno^...$确保之前或之后没有任何内容,并且i不区分大小写。

所以/^(n|no)$/i匹配n, N, no, No, nO, 和NO.

于 2013-09-18T08:33:04.127 回答