Ruby中基于Hash与Array实现自定义卡路里统计方法的问题
修正卡路里求和方法的实现
你的calories_counter方法存在两个关键问题:
- 错误地给数组元素拼接了冒号:哈希的key是纯字符串(比如"Hamburger"),
:#{element}会生成类似":Hamburger"的字符串,和哈希中的key完全不匹配,导致取值为nil,相加时会触发错误。 - 方法没有返回求和结果:Ruby方法默认返回最后一行代码的执行结果,原代码最后一行是
each循环,会返回原数组而非计算出的总和。
基础修正版本
def calories_counter(orders) sum = 0 orders.each { |element| sum += DISHES_CALORIES[element] } sum end
更简洁的Ruby风格实现
Ruby提供了更优雅的求和方式,直接用sum方法处理:
def calories_counter(orders) orders.sum { |item| DISHES_CALORIES[item] } end
或者用inject(和reduce是同一方法):
def calories_counter(orders) orders.inject(0) { |total, item| total + DISHES_CALORIES[item] } end
处理不存在的菜品(可选)
如果传入的数组包含哈希中没有的key,上面的写法会报错。可以给不存在的菜品默认加0,避免错误:
def calories_counter(orders) orders.sum { |item| DISHES_CALORIES[item] || 0 } end
内容的提问来源于stack exchange,提问作者Esteban
相关产品推荐
相关产品推荐

