Ruby -参数数目未知的哈希函数

hmtdttj4  于 2023-01-08  发布在  Ruby
关注(0)|答案(2)|浏览(122)

我正在尝试为下面的哈希菜单做一个卡路里计数器。在这个例子中我传递了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("芝士汉堡包"、"沙拉")的结果

njthzxwz

njthzxwz1#

在Ruby中,通常可以用与英语描述解决方案完全相同的方式编写代码,在这种情况下,您需要获取散列的特定键处的值,然后计算这些值的和**。
可以使用Hash#values_at方法获取特定键的值,也可以使用Array#sum方法计算这些值的总和:

def order(*items)
  @menu.values_at(*items).sum
end

注意,使用顶层main对象的示例变量是很奇怪的,使用常量会更有意义:

MENU = {
  'hamburger'     => 250,
  'Cheese burger' => 350, 
  'cola'          => 35, 
  'salad'         => 120,
  'dessert'       => 350,
}

def order(*items)
  MENU.values_at(*items).sum
end

这对freeze哈希也是有意义的:

MENU = {
  'hamburger'     => 250,
  'Cheese burger' => 350, 
  'cola'          => 35, 
  'salad'         => 120,
  'dessert'       => 350,
}.freeze

最后但并非最不重要的一点是,我发现order方法的名称有些误导,它也是模棱两可的:order是一个名词,而这意味着是一个获取订单的getter方法吗?或者它是一个动词,而这意味着是一个命令方法,告诉对象执行订单吗?
无论哪种方式,看起来这个方法并没有做这两件事中的任何一件,相反,它似乎计算了一个total,所以,名称可能应该反映这一点。

rbl8hiat

rbl8hiat2#

我会这样做:

MENU = {
  "hamburger" => 250,
  "Cheese burger" => 350, 
  "cola" => 35, 
  "salad" => 120,
  "dessert" => 350
}

def order(*args)
  MENU.values_at(*args).sum
end

order("hamburger", "Cheese burger", "cola")
#=> 635

了解有关Ruby Splat OperatorHash#values_atArray#sum的信息。
当你真的想使用each时(我不推荐),就像评论中提到的那样,那么你可以这样实现它:

def order(*args)
  total = 0
  args.each { |name| total += MENU[name] }
  total
end

def order(*args)
  total = 0
  MENU.values_at(*args).each { |value| total += value }
  total
end

相关问题