一。給Hash添加預設值 :
h = {1,2,3,4} #=> {1 => 2, 3 => 4}
h.default = 7
h[1] #=> 2
h[3] #=> 4
h[4] #=> 7
h[5] #=> 7
二。給Hash添加key-value對:
h = {} #=> {}
h.store("a",1) #=> 1
h["a"] #=> 1
h.fetch("a") #=> 1
h["b"] = 2 #=> 2
h["b"] #=> 2
p h #=> {"a"=>1, "b"=>2}
store和[]= 方法是別名的關係, fetch和[]方法是別名的關係。
三。清除Hash的key-value對:
h = {:a => 1, :b => 2}
刪除全部的k-v對,有兩種方法:
給hash賦空值
用clear方法 (這種方法更快一點)
shift方法隨機刪除k-v對。
h = {:a => 1, :b => 2, :c => 3}
h.shift #=> [:a, 1]
h #=> {:b=>2, :c=>3}
a = h.shift #=> [:c, 3]
a #=> [:c, 3]
delete, delete_if, reject,reject! 方法刪除指定的k-v對:
h = {:a => 1, :b => 2}
h.delete(:a) #=> 1
h #=> {:b=>2}
h = {:a => 1, :b => 2} #=> {:a=>1, :b=>2}
h.delete_if {|k,v| v != 3} #=> {}
h #=> {}
h = {:a => 1, :b => 2} #=> {:a=>1, :b=>2}
h.delete_if {|k,v| v != 1} #=> {:a=>1}
h = {:a => 1, :b => 2} #=> {:a=>1, :b=>2}
h.reject {|k,v| v!=2} #=> {:b=>2}
h #=> {:a=>1, :b=>2}
reject方法相當於dup.delete_if{}
四。顛倒Hash的k-v對。
h = {:a => 1,:b => 1} #=> {:a=>1, :b=>1}
x = h.invert #=> {1=>:b}
invert方法可以顛倒Hash的鍵-值,可是因為Hash鍵的唯一性,可能會發生上例那樣的資料丟失!
五。 Hash的迭代:
有each, each_key, each_value ,each_pair(each方法的別名)
不舉例了。
六。檢測Hash中的key,value:
檢測是否有key:
has_key?(include? 別名, 只能判斷key! ) ,key?, member?
檢測是否有value:
has_value? value?
七。將散列轉換為數組:
h = {:a => 1, :b => 2}
h.to_a #=> [[:a, 1], [:b, 2]] 轉換為一個二維數組。
h.keys #=> [:a, :b]
h.values #=> [1,2]
下面的方法有用點:
h = {:a => 1, :b => '2', :c => 5}
h.values_at(:a,:b) #=> [1, “2”] 根據指定的key返回對應values的數組
八。根據條件選擇key-value對:
h.detect {|k,v| v == "2"} #=> [:b, "2"]
detect和find是別名關係,是Enumerable模組裡的方法,Hash類mixin這個模組,所以也可以用。select 方法,別名是find_all,可以返回多個匹配的k-v對:
h.select {|k,v| v.is_a?(Integer)} #=> [[:a, 1], [:c, 5]]
九。 Hash的排序:
可以直接用sort方法,不過會返回一個二維數組。
值得注意的是,當Hash的key是Symbol類型的時候,sort方法會出錯。
十。 合并兩個Hash:
使用merge方法,( merge!和update是別名關係 (thx Beck) ) 。
h1 = {:a => 1, :b => 2} #=> {:a=>1, :b=>2}
h2 = {:b => 3, :d => 3} #=> {:d=>3, :b=>3}
h1.merge h2 #=> {:a=>1, :d=>3, :b=>3}
h2.merge h1 #=> {:a=>1, :d=>3, :b=>2}
注意看:b值的變化。
當然我們可以使用block來改變這一結局:
h1.merge h2 do |k,old,new|
old < new ? old : new
end
#=> {:a=>1, :d=>3, :b=>2}
h1.merge h2 do |k,old,new|
p old
p new
end
#=>2
#=>3
(當然我們可以使用rails裡active_support實現的revert_merge來實現上述效果)。
十一。 數群組轉換為Hash:
當數組元素為偶數個數的時候:
arr = %w[a b c d] #=> ["a", "b", "c", "d"]
h = Hash[*arr] #=> {"a"=>"b", "c"=>"d"}
此時數組必須為偶數個元素。
十二。 當Hash的key是動態變化的時候:
x = [1,2] #=> [1, 2]
h = {x => 2} #=> {[1, 2]=>2}
h[x] #=> 2
x[0] = 5 #=> 5
h[x] #=> nil
h.rehash #=> {[5, 2]=>2}
h[x] #=> 2