持久化Ruby中的哈希

时间:2014-11-13 04:49:14

标签: ruby hash persistent persist

我正在尝试解决一个简单的Ruby Quiz问题,并且在使用哈希时遇到了麻烦。当我使钱包成为常规变量时,循环不知道变量wallet,当我使它成为@wallet时,在循环后返回时,合并不会持久存在。

我还尝试了merge!收集所有垃圾并保存以前测试的数据。

class Coins
  COINSTAR = { :H=>50,:Q=>25,:D=>10,:N=>5,:P=>1 }

  def self.make_change(value)
    return {} if value == 0

    COINSTAR.each do |k,v|
      wallet = Hash.new
      if value >= v
        wallet.merge(k=>value / v)
        value = value - (v * (value % v))
      end
    end
    wallet
  end
end

#Test run
Coins.make_change(26)
Coins.make_change(91)
Coins.make_change(1)

#=>returns

# {:P=>1, :Q=>1}
# {:P=>1, :Q=>1, :H=>1}
# {:P=>1, :Q=>1, :H=>1}

关于如何在不收集先前测试数据的情况下持久化哈希的任何想法?

1 个答案:

答案 0 :(得分:3)

要使其发挥作用,您需要解决3个问题。

首先,正如ymonad所说,在每个循环之前移动wallet = Hash.new

其次,将merge更改为merge!

第三,将value = value - (v * (value % v))更改为value = value % v

需要进行第一次更改才能将钱包移到方法def self.make_change的范围内,而不是每个循环的范围。

需要进行第二次更改,因为您希望将数据保留在每个循环的所有迭代中(因此您可以获得半美元,四分之一,硬币,镍币和便士)。

需要进行第三次更改以确保价值等于剩余的硬币数量(例如,值为91,v为50,91 % 50 = 41,但91 - (50 * (91 % 50)) = {{1 }} = 91 - (50 * 41) = (91 - 2050))。