Когда вы звоните @units[unit]
, вы получаете nil
, потому что над ним вы звоните for
с единицей и суммой в обратном порядке.Смотри Gramulator.for(@amount, @unit)
.Сигнатура: def self.for(unit, amount)
.
При этом ... Возможно, я слишком упрощаю это, но я думаю, что ваш код может быть уменьшен.
Ниже я переписал его как скрипт, который могбыть установленным как исполняемый файл (с chmod +x
) и работать как . / gramulator.rb .
Не стесняйтесь пропустить первые и последние две строки, если вам нужно включить это в более крупный проект.
#!/usr/bin/env ruby
class Gramulator
UNITS = { "cups" => 236.58 }
def self.for(unit, amount)
amount.to_f * UNITS[unit]
end
end
class Recipe
def initialize(ingredients)
@ingredients = ingredients
end
def gramulate
puts "CONVERTED TO GRAMS"
@ingredients.each do |name, quantity|
amount, unit = quantity.split
puts "%s: %.2f grams" % [name, amount]
Gramulator.for(unit, amount)
end
end
end
dough = Recipe.new({ bread_flour: "3.5 cups" })
dough.gramulate
Пожалуйста примечание , что puts
возвращаетсяnil
и, следовательно, это хорошая привычка избегать его использования в конце метода цикла / итерации.Здесь вы используете each
, что хорошо, потому что вы, вероятно, не заинтересованы в повторном использовании результата ingredients.each {...}
.
Однако в Ruby вы могли бы получить гораздо больше удовольствия от других полезных *Методы 1030 *, такие как map , обнаружить и т. Д. Они возвращают нечто иное, чем исходная коллекция, с которой вы работаете, поэтому последняя строка их циклов должна быть 'что-то'.Я настоятельно рекомендую вам взглянуть на них.
Извините за то, что долго, это просто чтобы помочь вам чувствовать , что может предложить вам Руби.