【发布时间】:2019-07-07 22:04:38
【问题描述】:
我正在用 Ruby 构建一个具有以下哈希的收银机:
@change = [
{ :denomination => 0.01, :amount => 5 },
{ :denomination => 0.02, :amount => 5 },
{ :denomination => 0.05, :amount => 5 },
{ :denomination => 0.10, :amount => 5 },
{ :denomination => 0.20, :amount => 5 },
{ :denomination => 0.50, :amount => 5 },
{ :denomination => 1.00, :amount => 5 },
{ :denomination => 2.00, :amount => 5 }
]
当用户进行购买时,他们使用的硬币以数组的形式作为参数传入。
def pay(coins = [])
coins.each do |coin|
coin = @change.find { |x| x[:denomination] == coin }
coin[:amount] += 1
end
end
当我从终端手动测试 irb 时,这可以正常工作。但是,当我尝试运行 rspec 时,它会失败并出现 NoMethodError:
Failure/Error: coin[:amount] += 1
NoMethodError:
undefined method `[]' for nil:NilClass
我真的不明白为什么这会因 NoMethodError 而失败,尤其是当它在终端中运行良好时。有人可以帮忙吗?
谢谢:)
更新:
规格:
describe '#pay' do
it 'updates the change' do
till.pay([0.5])
expect(till.change).to include(:denomination=>0.5, :amount=>6)
end
end
【问题讨论】:
-
您的规范中的代码是什么?
-
@SebastianPalma 我已更新以添加到规范中 :)
-
在
pay中,coin 参数是浮点数数组,浮点数没有实现[]方法,因此出现错误。您能否进一步解释您正在尝试做什么,以便更好地理解和获得更好的答案? -
我明白了,但是当我在终端中对此进行功能测试时,它是如何工作的,看起来很奇怪?当然 - 当用户用硬币支付物品(本例中为 50p 硬币,即 0.5)时,我希望将其添加到收银机中已经存在的钱中(第一个哈希)。这有意义吗?
-
抱歉,最后一条评论并不是真正的问题,我混淆了错误,因为每个评论中都有硬币阴影变量。看看提供的答案。