Выявление проблемы
Существует множество способов решения проблемы с нулем, но на первый взгляд кажется, что часть проблемы здесь в том, что вы как-то ожидаете input чтобы вернуть действительный объект Ha sh из вашего вызова API, но пустая строка или экземпляр FalseClass могут этого не делать. Рассмотрим следующее:
input = gets.strip.downcase # <RETURN> here gets an empty string
input #=> ""
input.to_i > 0 #=> false
Затем учтите, что некоторые последующие потоки Breweries :: API.get_breweries ожидают работать вместо объекта Ha sh вместо экземпляра NilClass. В этом случае это выглядит как @breweries_hash[1]["name"]
и другие операции над @breweries_hash.
Некоторые параметры
Не зная больше о вашем коде, я не не хочу быть предписывающим здесь. Но в целом вы можете выполнить одно или несколько из следующих действий:
Привести аргументы к ожидаемому классу в вызове метода, сигнатуре метода или теле метода. Например, для объектов Array:
# coerce a String to an Array, raising an exception if it can't
input = ""
Array(input)
#=> [""]
# coerce some Array to a Hash
array = [:name, "foo", :street, "bar"]
Array(array.each_slice 2).to_h
#=> {:name=>"foo", :street=>"bar"}
Явно проверьте наличие объекта Ha sh:
fail "@breweries is not a Hash" unless @breweries.is_a? Hash
Raise исключение вместо возврата 0
, если input на самом деле не является действительным целочисленным представлением:
input = Integer(gets.strip.downcase)
Проверьте, есть ли у вас Ha sh или объект Array отвечает на соответствующие вызовы метода и вызывает более полезное сообщение об исключении:
raise sprintf("@brewery: %s", @brewery.class) unless @brewery.respond_to? :[]
Есть и другие вещи, которые вы могли бы сделать также. Вообще говоря, вам нужно изменить свой код, чтобы проверить возвращаемое значение вашего вызова, чтобы убедиться, что он не равен нулю, а затем соответствующим образом переходить / поднимать / спасать в зависимости от того, ожидаете ли вы когда-либо nils действительного возвращаемого значения. от Breweries :: API.get_breweries.
Примечание по использованию исключений для неисключительных обстоятельств
Как правило, вы должны вызывать исключения только для действительно неожиданных обстоятельств или когда программа должен быть остановлен, потому что некоторые условия не могут (или не должны) обрабатываться в программе во время выполнения. Что лучше в вашем конкретном случае использования, действительно является дизайнерским решением и выходит за рамки первоначального вопроса. Однако вы можете прочитать Exceptional Ruby от Avdi Grimm для более глубокого объяснения того, когда исключения могут быть лучше, чем ветвление или обработчики (или наоборот), но выбор в вашем коде немного левее центра. проблемы, с которой вы на самом деле сейчас сталкиваетесь.