使用SWAPI构建了starwars。我希望对我的代码进行分解,以便满足以下条件:
-At在程序中的任何点,如果用户输入无效的输入,程序不应该崩溃并提示用户重试
-The程序不应在任何时候退出,除非用户已显式选择退出
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发布于 2020-05-15 15:13:31
问题是这样开始的
input = gets.chomp.to_i将输入的文本转换为Integer。如果用户输入'exit',to_i方法会将其转换为0。在此之后,您将在(input-1)中进行比较。因此,exit-input将为-1。作为最后一个比较,您询问是否为-1 == 'exit',当然这是一个例外。
如果你想保持这种奇怪的方式来处理用户输入,你必须检查-1来确定用户输入的是否是非整数值。当然,这意味着如果用户输入类似Hello Aunt!的内容,您的程序也将退出。
https://stackoverflow.com/questions/61809972
复制相似问题