Ruby中Hash的7個日常使用範例

2021-06-28 00:26:20 字數 3389 閱讀 8211

此文翻譯自7 daily use cases of ruby hash,限於本人水平,翻譯不當之處,敬請指教!

每一天,你都需要跟hash相處。建立乙個新的hash或者是通過它的某乙個鍵去檢索其中的元素這樣的工作,都是常見也是非常簡單的。但是當你需要合併兩個巢狀的hash或者是從某乙個hash裡邊過濾某些鍵,你可能需要考慮得多一點。通過完整的文件,你可以找到對hash中的每乙個方法的充分解釋。但是由於文件不是面向應用場景的,你可能沒法很快找到你的解決方案。在下面,我分享了我日常中經常遇到的hash中的7個常用場景,希望它們對你有用。

假設你剛剛接收到乙個用json表示的twitter賬號的資料資訊:

data = ''
你希望能夠將它轉化為乙個hash,這樣會更方便你進行對資料的操作:

require 'json'

profile = json.parse(data)

** 在irb中的輸出結果:**

=>
檢視文件:json#parse

在你的web應用程式中,你需要追蹤當前星期每一天新註冊使用者的數量:

signups_of_the_week =
你可以通過api的方式把它們以json格式提供給客戶端:

require 'json'

signups_of_the_week.to_json

** 在irb中的輸出結果:**

=> ""
檢視文件:json#generate

邊注:json#pretty_generate對於更好的列印以及除錯非常有用。

你有乙個以name為索引的聯絡人的集合,也就是乙個巢狀的hash:

contacts = ,

'freddy' =>

}

當你在處理單個聯絡人的時候,你不需要每一次都檢查它是否存在。你只需要寫:

contacts['jane'][:email] = '[email protected]'

puts contacts['jane']

** irb輸出 **:

=>
你可以在建立hash的時候通過設定**塊來實現預設值:

contacts = hash.new do |hsh, key|

hsh[key] =

end

或者是使用:

contacts.default_proc = proc.new do |hsh, key|

??hsh[key] =

end

檢視文件:hash#new, hash#default_proc

wish_list = ,

??42 => }?

basket = ,

??1729 =>

}

借助於activesupport,你可以簡單地實現你的目標:

require 'active_support/core_ext/hash' # not necessary if in rails

?basket.deep_merge(wish_list)

又或者,在沒有activesupport的情況下:

def deep_merge(h1, h2)

??h1.merge(h2)

end?

deep_merge(basket, wish_list)

** irb輸出: **

=> ,

1729=>,

42=>

}

檢視文件:hash#merge, hash#deep_merge

你已經建立了乙個表示日銷售額的矩形圖,並且你將它以hash的方式儲存,每一天就是乙個key:

histogram =
你想從中過濾掉saturday以及sunday。通過activesupport,你可以像下面這樣做:

require 'active_support/core_ext/hash' # not necessary if rails

?histogram.except(:saturday, :sunday)

或者在沒有activesupport的情況下:

def filter(hsh, *keys)

??hsh.dup.tap do |h|

????keys.each

??end

end?

filter(histogram, :saturday, :sunday)

另乙個簡潔點實現則是基於reject方法的:

def filter2(hsh, *keys)

??hsh.reject

end

請注意,如果你正在處理乙個比較大的集合,你最好是先衡量下你的實現,一次選擇最好的其中乙個實現。

** irb輸出:**

=>
檢視文件:hash#except, hash#delete, hash#reject, object#dup, object#tap

在乙個骰子類遊戲中,你在hash中儲存了每乙個選手的得分:

scores =
你想要通過他們的得分對他們進行排序。你可以這樣做:

leaderboard = scores.sort_by
** irb輸出:**

=> [["death", 10], ["the lady", 3], ["fate", 2]]
檢視文件:enumerable#sort_by

邊注:hash通過元素插入時的順序去列舉它們的值。

假設你定期地從rss訂閱源中讀取資料,並且將他們放在了乙個hash裡邊:

entries =
當你更新了之後,你可能得到另乙個hash:

updated_entries =
你想要查詢出哪一條記錄才是新加的,這樣你就可以通過email的方式將它們傳送出去。最好的解決方案是:

new_entries = updated_entries.reject
** irb輸出:**

=>
檢視文件:hash#include?

Ruby中Hash雜湊結構的基本操作方法小結

關於雜湊 先來了解一下hash的基本思路 設要儲存物件的個數為num,那麼我們就用len個記憶體單元來儲存它們 len num 以每個物件ki的關鍵字為自變數,用乙個函式h ki 來對映出ki的記憶體位址,也就是ki的下標,將ki物件的元素內容全部存入這個位址中就行了。這個就是hash的基本思路。為...

ios7技巧 你需要掌握的19個iOS7使用技巧

從右往左滑動螢幕,可看到資訊收到的時間。指南針應用還可以用作水平儀,滑動螢幕即可。被蘋果稱作spotlight的搜尋功能有所改變。在螢幕中間向下滑動即可開啟該項功能,你可以搜尋文字 郵件 應用 歌曲 聯絡人等內容。ios 7擁有全新的視差效果。這意味著你的主螢幕上的圖示會隨著你在手機上的操作而移動。...

Ruby中寫乙個判斷成績分類的指令碼

需求為 從鍵盤輸入分數,以此來判斷,0 59為不及格,列印 您沒有及格,請下次努力 60 79為及格,列印 您的成績及格,請更加努力!80 100為成績良,列印 您的成績為優秀,請再接再厲 如果輸入為0 100以外的分數,請列印 您的成績為優秀,請再接再厲 如果採用ruby方式,比較精簡,如下所示 ...