gpt4 book ai didi

Ruby编码练习解决方案(rubymonk)

转载 作者:太空宇宙 更新时间:2023-11-03 17:53:21 24 4
gpt4 key购买 nike

我正在努力理解 Rubymonk 编码练习解决方案,但在理解 cost 方法中发生的事情时遇到了困难。

作为引用,菜单{:rice => 3, :noodles => 2},这样做的目的是计算订单的总成本菜单

一个订单示例是:

{:rice => 1, :noodles => 1} )

我想出的解决方案更简单,至少在我看来是这样,但返回了“无法将符号转换为整数”错误,我无法通过 to_i 纠正该错误。

    class Restaurant
def initialize(menu)
@menu = menu
end

def cost(*orders)
orders.inject(0) do |total_cost, order|
total_cost + order.keys.inject(0) {|cost, key| cost + @menu[key]*order[key] }
end
end
end

有人可以简单解释一下cost方法中的每一步吗?

最佳答案

考虑到正在计算总成本@menu 似乎包含单价(通常会发现,除了最好的餐厅)和每个order 包含订购的每个菜单项的编号。假设:

@menu = {rice: 0.69, noodles: 0.89}

其中的值是单价,orders 的一个元素看起来像这样:

{rice: 3, noodles: 2}

其中的值是订购的数量。供应此订单所给数量的成本为:

(3)(0.69) + (2)(0.89) = 3.95

您要将所有订单的成本相加。

首先,让我们这样写方法,

def cost( *orders )
orders.inject(0) do |total_cost, order|
total_cost + order.keys.inject(0) do |cost, key|
cost + order[key] * @menu[key]
end
end
end

阐明其结构。 inject(又名 reduce)迭代 orders 并在变量 total_cost 中累积一个值。您可以通过将参数传递给 inject 来为 total_cost 分配一个初始值(正如您所做的那样)。如果您不给 inject 参数初始值,total_cost 将设置为等于 inject 之后的 block 中的第一个评估值。在这种情况下,如果您放弃 inject 的参数,您会得到相同的结果。

对于 orders 的第一个值( block 变量 order),将以下数字添加到累加器 total_cost:

order.keys.inject(0) do |cost, key|
cost + @menu[key] * order[key]
end

要获得这个值,Ruby 必须进行边计算。假设 @menuorder 具有我上面给出的值。

inject(0) 使用 cost 迭代 order.keys(即 [:rice, :noodles]) 作为它的累加器。该 block 针对 :rice 执行,然后针对 noodles:

执行
  cost + order[:rice]    * @menu[:rice]    => 0    + 3 * 0.69  # => 2.07 => cost
cost + order[:noodles] * @menu[:noodles] => 2.07 + 2 * 0.89 # => 3.95 => cost

这就完成了边计算,所以 3.95 被添加到外部累加器 total_cost(之前等于零)。 orders 的下一个元素然后由外部 inject 处理,依此类推。

关于Ruby编码练习解决方案(rubymonk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19717242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com