如何在Ruby中验证多项选择提示下的命令行输入?

2q5ifsrm  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(110)

我正在编写一个多项选择测验,用户必须通过输入ad之间的字母来选择答案。每个问题的提示如下所示:

What is the last letter in alphabet?
(a) Y
(b) R
(c) Z
(d) Q

如果用户输入了其他内容,我希望显示一条消息并再次打印整个问题,直到输入为abcd
以下是我尝试过的方法:(简体字)

question = "What is the last letter in alphabet?\n(a) Y\n(b) R\n(c) Z\n(d) Q"

puts question
answer = gets.chomp.to_s
while answer > "d"
  puts "Please enter a, b, c, or d"
  puts
  puts question
  answer = gets.chomp.to_s
end

当输入efg等时,它可以正常工作,但它不能捕获像ab1Z这样的输入,或者当用户只是按回车键时。

cclgggtu

cclgggtu1#

您的方法不起作用,因为answer > "d"使用两个字符串的(Unicode)码位来比较字符串。(它相当于ASCII表)

“d”的码位为U+0064。任何较小的码位(即图表中“d”之前的每个字符)都被视为较小的码位。这包括所有(常规)数字、所有(基本拉丁文)大写字母和以下几个符号:

"0" > "d"  #=> false
"Z" > "d"  #=> false

您可以添加answer < "a" || answer > "d"之类的下限,但这仍将允许所有字符串 * 以 * 允许的字符之一开头,例如:

"apple" < "a" || "apple" > "d" #=> false

要将答案限制为四个允许的值,必须将字符串与它们中的每一个进行比较。可以将这些比较组合在一起:

answer == 'a' || answer == 'b' || answer == 'c' || answer == 'd'

对允许值的数组使用循环:

['a', 'b', 'c', 'd'].any? { |letter| answer == letter }

检查数组是否包含答案:

['a', 'b', 'c', 'd'].include?(answer)

# or

%w[a b c d].include?(answer)

或者使用正则表达式将ad进行匹配:

answer.match?(/\A[a-d]\z/)

请注意,如果answer * 介于ad之间,则上述示例为真。您可以通过!(...)求反该条件:

while !(%w[a b c d].include?(answer))
  # ...
end

或者使用until而不是while

until %w[a b c d].include?(answer)
  # ...
end
chhqkbe1

chhqkbe12#

你只有四个允许的输入。直接检查那些。即使像if !(answer == "a" || answer == "b" ...那样不优雅。其他任何输入都将接受一些无效的输入。特别是if answer > "d"允许"ab"作为有效的答案。

6pp0gazn

6pp0gazn3#

其他答案已经回答了您问题标题中给出的问题。
我想建议您考虑采用以下代码的一些变体。
第一个
假设可能的答案如下。

answers = %w| Y R Z Q |
  #=> ["Y", "R", "Z", "Q"]

然后

choices_to_answers = construct_choices_to_answers(answers)
  #=> {"a"=>"Y", "b"=>"R", "c"=>"Z", "d"=>"Q"}

display_choices(choices_to_answers)

印刷品

(a): Y
(b): R
(c): Z
(d): Q

这里我假设选项总是以"a"开头的连续字母,如果这个假设是正确的,就不需要手动将这些字母与可能的答案关联起来。
现在让我展示一个与方法的可能对话(使用上面定义的answers)。

question = "What is the last letter in the alphabet?"
get_answer(question, answers)
  #=> "R"

将显示以下内容。

What is the last letter in the alphabet?
(a): Y
(b): R
(c): Z
(d): Q    
answer: e

That answer is invalid.
Enter a letter between 'a' and 'd'

What is the last letter in the alphabet?
(a): Y
(b): R
(c): Z
(d): Q
answer: b

然后,您可以构造一个哈希数组,该数组提供问题、可能的答案、正确答案、可能的问题权重以及一个指示是否给出了正确答案的布尔值。

questions = [
  ...
  { question: "What is the last letter in the alphabet?",
    answers: ["Y", "R", "Z", "Q"],
    correct_answer: "Z",
    weight: 1,
    correct_answer_given: nil
  },
  ...
]

每个问题的:correct_answer_given值在回答问题时更新为truefalse。一旦回答了所有问题,questions就可以用于确定考试分数。
如果你想给每个问题分配一个数字,你可以写
第一个
如果question_number #=> 12

h[:question]
  #=> "What is the last letter in the alphabet?",

然后

g[:question]
  #=> "12. What is the last letter in the alphabet?"

相关问题