我正在编写一个简单的文本游戏来学习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%,但这是另一个挑战,我想自己解决,所以请不要对此发表评论。更重要的是,我还有一个关于哈希的问题。是否有义务使用键和值,因为在谷歌教程中,我看到人们使用"name,value"或"person,name"等配对,而不是"key,value",而没有定义任何内容。
首先,我会尝试丢失全局变量,因为它们通常比它们的价值更痛苦。基本上是因为调试过程变得非常痛苦,尤其是当你在几个地方更改它的值时,这里有一些好的替代方案。
除此之外,我认为您想做的是为Hash中的值分配一个不同的值。您可以通过以下方式实现:
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
希望这能有所帮助。
散列中的each
方法将在块中为您提供两项工作。这取决于你如何命名这些东西,以及你如何定义它们之间的名称。
新值必须在块结束前显式存储在哈希中:
$stocks[key] = value
在回答第二个问题时,您可以使用任何您想要的作为"key"one_answers"value"。这些是每个循环范围内的局部变量。然而,无论您提供什么标签,都将在迭代时对应哈希的"键"one_answers"值"。您可能应该选择对循环有意义的名称。
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
但第一种肯定更容易理解。
您可以随意调用迭代器中的键和值。但这可能是对哈希中的密钥和值的误解。这就是为什么很少使用其他名称来表示键和值(即使我从未见过这个)。