此文翻譯自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方式,比較精簡,如下所示 ...