2012-11-15 42 views
-3

我知道所有@@logHash鍵的第一個值包含IP地址。我想迭代那個位置來爲一個新的散列創建密鑰,如果它不是一個重複的密鑰。如何迭代ruby散列中的特定值位置?

這裏是我有什麼,但我知道這不可能是正確的...

def ipaddresses(@@logHash) 
    @@ipHash = Hash.new 
    @@logHash[1].each_value do | value | 
     if @@ipHash.has_key?(value) 
      @@ipHash[value] += "#" 
     else 
      @@ipHash[value] = "#" 
     end 
     puts "" 
     @@ipHash.sort.each { |key,value| puts "The frequency of #{key} is |#{value}"} 
    end 
end 

任何幫助表示感謝,謝謝!

麗莎

回答

0

這裏有一個重新設計的版本,可能是更接近你想要什麼:

def ipaddresses(logHash) 
    ipHash = Hash.new(0) 

    logHash[1].each_value do | value | 
    ipHash[value] += 1 
    puts "" 
    end 

    ipHash.sort.each { |key,value| puts "The frequency of #{key} is |#{value}"} 
end 

你爲什麼用這樣的方法@@類變量目前尚不清楚。他們在任何情況下都非常不尋常。對於臨時變量或方法參數,不需要前綴。

這裏Hash.new(0)創建一個默認值爲0的新散列。這樣就避免了在使用它們之前必須預先初始化密鑰,如在Ruby中添加任何內容到nil被認爲是無效的。

+0

我對ruby非常新鮮,但這是一個類中多個方法之間的方法,我希望這些哈希用於多個方法,這就是爲什麼他們是類變量。這是不正確的? – user1825643

+0

所以這個「logHash [1] .each_value do | value |」確實能夠迭代logHash中所有鍵的第一個值?這是我最關心的問題。 – user1825643

+0

您應該使用'@'-type實例變量在類的單個實例之間共享它們,而不是在類的* all *實例之間共享的@@'。如果你犯了使用'@@'變量的錯誤,你會看到數據從一個實例流到另一個實例。無論哪種情況,方法的參數都沒有任何類型的「@」前綴。 – tadman

0

你不能有一個類變量(或任何非本地變量)作爲參數。這樣做沒有意義。參數是與方法調用一起傳遞的東西。如果你想在方法定義中引用一個類變量,你可以直接引用它。通過論證傳遞是多餘的,因此通過設計而變得不可能。