以下是代码:
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;无"。)
我的问题有两个。
是否有一种有效的方法可以摆脱因elsif
行上的冗余或语句而出现的文字字符串错误? (代码本身工作正常,但出现此错误并令人沮丧)。
当用户发出备用/未指定的输入时,else分支不会执行,而main_method也不会重新开始。我不知道为什么会这样。我在这里找不到什么东西?
由于
答案 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
的值是“真实的”。也就是说,第一个表达式不会评估为false
或nil
。
所以在这种情况下,它表示Ruby表达式的逻辑检查:
(user_selected == "1") || "2" || "3" || "4" || "5" || "6" || "7"
如上所述,该表达式的结果将是第一个“truthy”的子表达式。如果user_selected
的值为“1”,则结果为true
,elsif
将成功。如果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