【问题标题】:RUBY - Hash and Array // Explanation of a method useRUBY - Hash and Array // 方法使用说明
【发布时间】:2022-11-06 17:43:31
【问题描述】:

我有一个hash,其中每个键都有一个值(一个整数)。我想做的是创建一个方法,在其中我写一个array作为参数,这个array将写在不同键的名称中。

因此,一旦我将array 提供给该方法,它将对每个元素的所有值求和。但我不知道如何通过我的array,将所有元素放入hash,然后求和,得到总值。

这是我的代码:

DISHES_CALORIES = {
  "Hamburger" => 250,
  "Cheese Burger" => 300,
  "Veggie Burger" => 540,
  "Vegan Burger" => 350,
  "Sweet Potatoes" => 230,
  "Salad" => 15,
  "Iced Tea" => 70,
  "Lemonade" => 90
}

def poor_calories_counter(burger, side, beverage)
  DISHES_CALORIES[burger] + DISHES_CALORIES[side] + DISHES_CALORIES[beverage]
end

def calories_counter(orders)
  # TODO: return number of calories for a less constrained order
  sum = 0
  orders.each { |element| sum = sum + DISHES_CALORIES[":#{element}"] }
end

【问题讨论】:

  • 可以将哈希命名为常量(完全大写)吗?

标签: arrays ruby hash


【解决方案1】:

你很接近,但是:

  1. 您无需对订单执行任何操作即可使其成为索引。
  2. orders.each 将在完成后返回 orders
  3. 您需要处理返回nilDISHES_CALORIES[element]

    您可以将块传递给#sum

    def calories_counter(orders)
      orders.sum { |order| CALORIES_COUNTER[order] || 0 }
    end
    

【讨论】:

  • CALORIES_COUNTER[order].to_i 是处理可能的nils 的另一种方式
  • 完美的!现在我明白你在说什么了!!
  • 作为 Stack Overflow 的新手,我想提醒您,您可以通过投票和/或标记您认为已回答您的问题的答案来表示“谢谢”。
  • 您可能会发现 orders.sum { |order| CALORIES_COUNTER.key?(order) ? CALORIES_COUNTER[order] : 0 } 读起来更好。考虑到哈希键查找非常快,我希望从性能的角度来看这是可以接受的。
  • 是的,您应该接受您认为最有帮助的答案(前提是有一个有用的答案),但不要急于这样做,因为您不希望阻止提供的其他答案。
【解决方案2】:

您还可以使用哈希的默认值来计算所有地方的卡路里而不会出错

DISHES_CALORIES.default = 0

def calories_counter(orders)
  orders.sum { |element| DISHES_CALORIES[element] }
end

【讨论】:

    【解决方案3】:

    您可以允许像这样的多个菜单项:

    choices = ["Hamburger","Salad","Lemonade"]
    
    p DISHES_CALORIES.values_at(*choices).sum # => 355
    

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 2014-08-17
      • 2016-03-24
      • 2018-08-29
      • 2020-10-31
      相关资源
      最近更新 更多