2012-02-25 83 views
0

我正在編寫一個簡單的文本遊戲來學習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%的價格,但這是另外一個挑戰,我想通過自己來解決,所以請不要在一個評論。更重要的是,我還有一個關於哈希的問題。有沒有義務使用關鍵和價值,因爲谷歌搜索教程,我已經看到人們使用像「名稱,價值」或「人,名稱」,而不是「鍵,價值」對,而沒有定義任何東西。

回答

0

從散列的each方法會給你兩個東西在塊中使用。這取決於你如何命名這些東西,並且在||之間定義名稱。

新值已經被明確地存儲在散塊結束前:

$stocks[key] = value 
+0

謝謝,我用[「鑰匙」]嘗試過,但現在我看到了錯誤。 – barerd 2012-02-25 17:03:02

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 

希望這會有所幫助。

+0

這是一個非常好的代碼示例,它使我明白通過函數完成任務是多麼容易。因爲我是noob,所以我不能想到這樣的美學代碼。我讀了你推薦的鏈接,但是既沒有我編碼的程序,也沒有從這個wiki中受益的位置:)但至少現在我發現我不知道如何將變量從一種方法傳遞給另一種方法,這就是我使用全局變量的原因。 – barerd 2012-02-25 20:48:22

0

你可以隨心所欲地調用迭代器中的鍵和值。但是這可能會誤解什麼是關鍵,什麼是你的哈希值。這就是爲什麼使用其他名稱作爲關鍵字和值的原因(甚至我從來沒有見過這個名字)。

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 

但首先肯定是更容易理解。