条件分支问题

时间:2014-06-08 03:18:10

标签: ruby string if-statement

以下是代码:

def main_menu
    print_main_menu
    user_selected  = gets.chomp
    if user_selected.downcase == "no"
        main_menu
    elsif user_selected == "1" || "2" || "3" || "4" || "5" || "6" || "7"
        user_selected = user_selected.to_i
        call_option(user_selected)
    else
        main_menu
    end
end

此代码使用调用允许用户从主菜单中进行选择。根据输入,无论是某个数字,某个单词还是其他内容,都会调用相应的方法(在有效输入的情况下)或再次打印主菜单(如果输入无效或者& #34;无"。)

我的问题有两个。

  1. 是否有一种有效的方法可以摆脱因elsif行上的冗余或语句而出现的文字字符串错误? (代码本身工作正常,但出现此错误并令人沮丧)。

  2. 当用户发出备用/未指定的输入时,else分支不会执行,而main_method也不会重新开始。我不知道为什么会这样。我在这里找不到什么东西?

  3. 由于

2 个答案:

答案 0 :(得分:1)

您的elsif行相对于您的意图在语义上无效。在Ruby中,您无法通过x == v1 || v2 || ...检查变量值与其他几个值。您可能需要考虑使用Ruby case statement

def main_menu
  print_main_menu
  user_selected  = gets.chomp

  case user_selected.downcase
  when "no"
    main_menu
  when "1", "2", "3", "4", "5", "6", "7"
    user_selected = user_selected.to_i
    call_option(user_selected)
  else
    main_menu
  end
end

应该注意的是,以下表达式不会按照您的想法执行:

elsif user_selected == "1" || "2" || "3" || "4" || "5" || "6" || "7"

不会user_selected与逻辑OR分隔的每个项目进行比较。

您正在使用的表达式虽然没有您想要的意图,但不会生成错误,因为这是一个有效的Ruby表达式:

exp-1 || exp-2 || exp-3 || ... || exp-N

其中第一个exp-i的值是“真实的”。也就是说,第一个表达式不会评估为falsenil

所以在这种情况下,它表示Ruby表达式的逻辑检查:

(user_selected == "1") || "2" || "3" || "4" || "5" || "6" || "7"

如上所述,该表达式的结果将是第一个“truthy”的子表达式。如果user_selected的值为“1”,则结果为trueelsif将成功。如果user_selected不是“1”,那么上面的表达式的值将是"2",因为它是“真实的”,elsif仍然会成功。事实上,总是成功(因为"2"始终是“真实的”)。

因此,除非您输入9之类的内容,否则代码将尝试执行call_option(9)并且可能会产生一些意外结果,具体取决于call_option执行的操作意外的参数值。

答案 1 :(得分:1)

用例:

case user_selected
when "1", "2", "3", "4", "5", "6", "7"
    user_selected = user_selected.to_i
    call_option(user_selected)
else # includes "no"
    main_menu
end