无法在Ruby中更改/替换全局哈希值

时间:2012-02-25 16:27:39

标签: ruby variables hash global-variables

我正在编写一个简单的文字游戏来学习红宝石。哈希必须是一个全局变量,因为我必须在其他函数中访问它(可能还有其他解决方案,但我可以找到这个)。我正在尝试更改哈希元素的值。下面的函数基本上将当前价格提高了10%,并且在当前形式下正确地更改了值并输出它们但未能将它们写入原始哈希值。

$stocks = {"DOHOL" => 10, "GOZDE" => 5, "KONYA" => 20}

def margin
  puts "New values:\n "
  $stocks.each do|key, value|
    percent = (value.to_i / 10) + 1
    change = rand(percent)
    value += change
    puts "#{key}: #{value} USD"
  end
end

我当然希望我可以让它随机减少/增加价格10%,但这是另一项挑战,我想自己解决,所以请不要评论那个。更重要的是,我还有另一个关于哈希的问题。是否有义务使用密钥和价值,因为谷歌搜索教程,我看到人们使用“名称,价值”或“人,名”等对而不是“键,值”而没有定义任何内容。

4 个答案:

答案 0 :(得分:1)

首先,我会尝试丢失全局变量,因为它们通常比它们的价值更痛苦。基本上是因为调试过程变得非常痛苦,特别是当你在几个地方改变它的价值时,这里有一些good alternatives

除此之外,我认为您要做的是为哈希值中的值分配不同的值。您可以按如下方式实现此目的:

    def margin(hash)
      hash.each do |stock, value|
        hash[stock] = random_stock_increase(value)
      end
    end

    def random_stock_increase(value)
      increase = rand((value.to_i / 10) + 1)
      value + increase
    end

希望这有帮助。

答案 1 :(得分:0)

哈希中的each方法将为您提供两个在块中使用的方法。这取决于你如何命名这些东西,并在||的名称之间定义名称。

新值必须在块结束之前显式存储在哈希值中:

$stocks[key] = value

答案 2 :(得分:0)

您可以根据需要随意调用迭代器中的键和值。但是这里可能误解了什么是关键,什么是哈希值。这就是为什么很少使用其他名称作为键和值(即使我从未见过这个名字)。

答案 3 :(得分:0)

在回答第二个问题时,您可以使用任何您想要的“关键”和“价值”。这些是每个循环范围内的局部变量。但是,您提供的任何标签都将对应于迭代时哈希的“键”和“值”。您应该选择对您的循环有意义的名称。

stocks = {"DOHOL" => 10, "GOZDE" => 5, "KONYA" => 20}
stocks.each do |name, price|
  stocks[name] = price * 2
end

完全等同于

stocks = {"DOHOL" => 10, "GOZDE" => 5, "KONYA" => 20}
stocks.each do |pirate, ninja|
  stocks[pirate] = ninja * 2
end

但第一个当然更容易理解。