- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在努力理解 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 必须进行边计算。假设 @menu
和 order
具有我上面给出的值。
inject(0)
使用 cost 迭代
作为它的累加器。该 block 针对 order.keys
(即 [:rice, :noodles]
) :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/
我正在努力理解 Rubymonk 编码练习解决方案,但在理解 cost 方法中发生的事情时遇到了困难。 作为引用,菜单是{:rice => 3, :noodles => 2},这样做的目的是计算订单的
我对来自 RubyMonk 的以下问题的回答有点困惑. Let's find the second character in the string 'RubyMonk Is Pretty Brilli
在这个页面上: https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/10
来自 Rubymonk ascent 教程“Ripping the Guts”,这段代码有什么区别:(我的) # compute([[4, 8], [15, 16]]) def compute(ary
我真的尝试过研究这个问题,但我现在离它太近了,我担心如果不寻求帮助我就找不到解决方案。我正在学习 RubyMonk,其中一个练习让我完全不知所措。 class Hero def initializ
我正在尝试了解 RubyMonk 练习的解决方案。我可以遵循大部分代码,但不能遵循以下行, 虽然不是 (superclass = klass.superclass).nil? 这是在创建一个名为“父类
我是一名优秀的程序员,十分优秀!