【问题标题】:Cannot change/replace values of a global hash in Ruby无法更改/替换 Ruby 中全局哈希的值
【发布时间】:2012-02-25 16:27:38
【问题描述】:

我正在编写一个简单的文字游戏来学习 ruby​​。哈希必须是一个全局变量,因为我必须在其他函数中访问它(可能有其他解决方案,但我可以找到这个)。我正在尝试更改哈希元素的值。下面的函数基本上将当前价格提高了 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% 的价格,但这是另一个挑战,我想自己解决,所以请不要对此发表评论。更重要的是,我还有一个关于哈希的问题。是否有义务使用键和值,因为谷歌搜索教程,我看到人们使用“名称,值”或“人,名称”之类的对而不是“键,值”而不定义任何内容。

【问题讨论】:

    标签: ruby variables hash global-variables


    【解决方案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
    

    希望这会有所帮助。

    【讨论】:

    • 这是一个非常好的代码示例,它让我明白了用函数完成事情是多么容易。由于我是菜鸟,我还想不出这样的美学代码。我阅读了您推荐的链接,但既不是我编写的程序,也不是我能够从该wiki中受益的:)但至少现在我看到我不知道如何将变量从一种方法传递给另一种方法,这就是我使用全局变量的原因。
    【解决方案2】:

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

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

    $stocks[key] = value
    

    【讨论】:

      【解决方案3】:

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

      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
      

      但第一个肯定更容易理解。

      【讨论】:

        【解决方案4】:

        您可以随意调用迭代器中的键和值。但这里可能会误解什么是键,什么是哈希值。这就是为什么很少使用其他名称来表示键和值(即使我从未见过这个)。

        【讨论】:

          猜你喜欢
          • 2013-07-21
          • 1970-01-01
          • 2021-12-07
          • 2014-11-06
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          • 2016-01-27
          • 2012-12-02
          相关资源
          最近更新 更多