我正在尝试解决一个简单的Ruby测试问题,但是在使用散列时遇到了问题当我将wallet设置为常规变量时,循环不知道变量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}

关于如何在不收集以前测试的数据的情况下持久化散列有什么想法吗?

最佳答案

为了让这个工作,你需要解决3个问题。
首先,正如ymonad所指出的,在每个循环之前移动wallet = Hash.new
其次,将merge更改为merge!
第三,将value = value - (v * (value % v))更改为value = value % v
第一个更改需要将wallet移动到def self.make_change方法的范围,而不是每个循环的范围。
第二个更改是必需的,因为您确实希望在每个循环的所有迭代中持久化数据(这样您就可以得到半美元、四分之一美元、一角硬币、五分镍币和一角硬币)。
需要进行第三次更改以确保值等于剩余硬币的数量(例如,值为91,v为50,91 % 50=4191 - (50 * (91 % 50))=91 - (50 * 41)=(91 - 2050)=-1959=)。

关于ruby - 在Ruby中保留哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26901544/

10-13 04:49