当用户输入错误信息时,如何返回错误消息?

时间:2018-04-29 17:51:44

标签: ruby if-statement while-loop

我有一个显示编号列表的程序,并要求用户从列表中输入一个数字或名称,并循环一个块,直到用户输入"exit",然后结束。

我想添加一行或两行,如果用户输入的内容不在列表中(名称/编号)且不是单词"Sorry, I don't seem to understand your request",则会显示错误消息,例如"exit"

我似乎无法弄明白。有什么建议?我目前的代码如下。

def start
  display_books
  input = nil
  while input != "exit"
    puts ""
    puts "What book would you more information on, by name or number?"
    puts ""
    puts "Enter list to see the books again."
    puts "Enter exit to end the program."
    puts ""
    input = gets.strip
    if input == "list"
      display_books
    elsif input.to_i == 0
      if book = Book.find_by_name(input)
        book_info(book)
      end
    elsif input.to_i > 0
      if book = Book.find(input.to_i)
        book_info(book)
      end
    end
  end
  puts "Goodbye!!!"
end

2 个答案:

答案 0 :(得分:0)

似乎您应在此elsif中添加if语句:

if book = Book.find_by_name(input)
  book_info(book)
elsif input != 'exit'
  puts "Sorry, I don't seem to understand your request"
end

答案 1 :(得分:0)

解释器的一个好模板是围绕Ruby非常强大的case语句构建:

loop do
  case (gets.chomp.downcase)
  when 'list'
    display_books
  when /\Afind\s+(\d+)/
    if book = Book.find($1.to_i)
      book_info(book)
    end
  when /\Afind\s+(.*)/
    if book = Book.find_by_name($1)
      book_info(book)
    end
  when 'exit'
    break
  else
    puts "Not sure what you're saying."
  end
end

虽然这涉及正则表达式,这可能有点可怕,但它确实为您提供了很大的灵活性。 \A表示"字符串的开头"作为锚,\s+表示"一个或多个空格"。这意味着您可以输入find 99,它仍然可以使用。

如果您花时间清楚地指定命令,则可以使用它创建整个命令行界面。像show book 17delete book 17之类的东西都可以进行一些修改。