我正在尝试为下面的哈希菜单做一个卡路里计数器。在这个例子中我传递了3个参数-函数需要什么看起来像它的参数/参数的数量是未知的?
@menu = {
"hamburger" => 250,
"Cheese burger" => 350,
"cola" => 35,
"salad" => 120,
"dessert" => 350
}
def order(a, b, c)
return @menu[a] + @menu[b] + @menu[c]
end
puts order("hamburger", "Cheese burger", "cola")
tried
def order(**a)
total = 0
total += @menu[**a]
end
我知道(* a)适用于数组。
例如,我希望能够获得puts order("汉堡包")的结果,并同样获得puts order("芝士汉堡包"、"沙拉")的结果
2条答案
按热度按时间njthzxwz1#
在Ruby中,通常可以用与英语描述解决方案完全相同的方式编写代码,在这种情况下,您需要获取散列的特定键处的值,然后计算这些值的和**。
可以使用
Hash#values_at
方法获取特定键的值,也可以使用Array#sum
方法计算这些值的总和:注意,使用顶层
main
对象的示例变量是很奇怪的,使用常量会更有意义:这对
freeze
哈希也是有意义的:最后但并非最不重要的一点是,我发现
order
方法的名称有些误导,它也是模棱两可的:order
是一个名词,而这意味着是一个获取订单的getter方法吗?或者它是一个动词,而这意味着是一个命令方法,告诉对象执行订单吗?无论哪种方式,看起来这个方法并没有做这两件事中的任何一件,相反,它似乎计算了一个
total
,所以,名称可能应该反映这一点。rbl8hiat2#
我会这样做:
了解有关Ruby Splat Operator、
Hash#values_at
和Array#sum
的信息。当你真的想使用
each
时(我不推荐),就像评论中提到的那样,那么你可以这样实现它:或