【问题标题】:if user inters invalid input, program should not crash and promt user again - refactoring cli project如果用户输入无效输入,程序不应崩溃并再次提示用户 - 重构 cli 项目
【发布时间】:2020-05-15 01:03:11
【问题描述】:

使用 SWAPI 构建了一个星球大战 API。我想分解我的代码,以便满足以下条件:

-在你的程序中的任何时候,如果用户输入了无效的输入,程序不应该崩溃并提示用户重试

-除非用户明确选择退出,否则程序不应随时退出

    def menu
    puts "Please select from a category below:" 
    StarwarsCLI::Category.all.each_with_index {|cat, i|

        puts "#{i + 1}. #{cat.name.capitalize} "

    }
    input = gets.chomp.to_i 
    category = StarwarsCLI::Category.all[input-1]
    StarwarsCLI::APIService.get_items(category)
    items = Module.const_get("StarwarsCLI::#{category.name.capitalize}").all

    if (input-1) == 0
        return list_people

    elsif (input-1) == 1
        return list_planets

    elsif (input-1) == 2
        return list_films

    elsif (input-1) == 3
        return list_species

    elsif (input-1) == 4
        return list_vehicles

    elsif (input-1) == 5
        return list_starships

    elsif input == "exit"
        exit 

    else
        puts "Not a valid option, choose another."
        return menu 
    end
end

添加行后

elsif input == "exit"
        exit 

    else
        puts "Not a valid option, choose another."
        return menu 

我的代码不再运行,我的错误消息是

Traceback (most recent call last):
    3: from bin/starwars:5:in `<main>'
    2: from /mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/command_line_interface.rb:9:in `run'
    1: from /mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/command_line_interface.rb:21:in `menu'
/mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/api_manager.rb:17:in `get_items': undefined method `url' for nil:NilClass (NoMethodError)

如果有人介意解释到底出了什么问题,我真的可以使用一些帮助来运行此代码。

我尝试在第 17 行下添加一个 `break if input == "exit"' 并出现错误 "invalid break" 所以我虽然可以将其添加到底部

https://github.com/codyalvarez/starwars-api

【问题讨论】:

  • 也许你可以先使用 begin-rescue 来防止它崩溃。
  • 问题出现在您的 get_items 方法中 - 您正在传递一个 nil cat
  • 是时候了解case 语句,或者更好的是,将菜单选项映射到方法的哈希查找表。
  • @eightbithero : input 包含一个 Integer。您不能将整数与字符串进行比较。

标签: ruby api command-line-interface


【解决方案1】:

问题开始于

input = gets.chomp.to_i

您将输入的文本转换为整数。如果用户输入'exit',to_i 方法会将其转换为 0。之后,您将根据(input-1) 进行比较。因此 exit 输入将是 -1。作为最后一个比较,你问是否-1 == 'exit',当然这是一个例外。

如果您想保持这种 IMO 奇怪的方式来处理用户输入,您必须检查 -1 以查明用户是否输入了非整数值。当然,这意味着如果用户输入类似 Hello Aunt Melanie! 之类的内容,您的程序也会退出。

【讨论】:

  • 我很欣赏这个回应 - 我使用奇怪的方式来处理用户输入,因为在星球大战系列中,电影是从 1-6(不包括所有较新的迪士尼电影)而不是 0-6。这很奇怪- 输入一个字母会返回不想要的“puts”“不是一个有效的选项,选择另一个。”返回菜单——但是当我输入一个数字时,我得到同样的错误,当我输入“exit”而不是退出它返回的程序时,再次提出“不是一个有效的选项,选择另一个。”返回菜单
  • 嗯,这并不意味着您必须以这种方式处理输入,但是如果您愿意,您当然可以这样做。
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
相关资源
最近更新 更多