1、Hash表的生成
使用第一种形式时,参数的个数必须是偶数.(奇数位参数是索引,偶数位参数是元素值).
使用第二种形式(将一个哈希表对象指定给参数)时, 将生成并返回一个与指定哈希表相
同的全新的哈希表.(生成的哈希表的默认值为nil.).
a) 由[索引, 值, ...] 型的数组变为哈希表
ary = [1,"a", 2,"b",3,"c"]
p Hash[*ary] #=> {1=>"a", 2=>"b", 3=>"c"}
b) 由索引和值配对出现的数组变为哈希表
alist =[[1,"a"], [2,"b"], [3,"c"]]
p Hash[*alist.flatten] #=>{1=>"a", 2=>"b", 3=>"c"}
c) 由索引数组和值数组配对生成哈希表
keys = [1, 2, 3]
vals = ["a", "b", "c"]
alist = keys.zip(vals) # 或 alist = [keys,vals].transpose
p Hash[*alist.flatten] #=>{1=>"a", 2=>"b", 3=>"c"}
d) 直接赋值法生成哈希表
h = Hash.new
alist = [[1,["a"]], [2,["b"]],[3,["c"]]]
alist.each {|k,v|
h[k] = v
}
p h #=>{1=>["a"], 2=>["b"], 3=>["c"]}
Hash.new([ifnone])
Hash.new {|hash, key| ...}
2、hash的常用方法
1、[]
self[key]
返回索引为key的哈希表元素的值.若该索引并未注册,则返回默认值(若未设定则为nil).若想区分该nil到底是默认值还是哈希表元素值时,使用fetch.
2、self[key]=value、store(key,value)
将索引为key的元素值设为value.返回value.
3、clear:
清空哈希表的内容. 返回self.
4、clone、dup
返回一个与receiver内容一致的新哈希表. 对冻结的哈希表进行clone时将返回一个同样的冻结的哈希表.但使用dup时,将返回内容相同但却并未冻结的哈希表.
5、default、default([])
default、default([key])
返回哈希表的默认值.
6、default=value
将哈希表的默认值设为value.若使用无对应值的索引进行搜索时,将返回该值.
7、delete
delete(key)、delete(key) {|key| ... }
删除索引key与对应元素之间的关系.返回被删除的值.若没有值与key相对应,则返回nil.
8、 reject
reject {|key, value| ... }、reject! {|key, value| ... }、delete_if {|key, value| ... }
拷贝self之后对块进行计算,若计算值为真则删除相应的哈希表元素,最后返回该哈希表.
把key和value当做参数来计算块,若计算值为真则删除相应的元素.
通常delete_if返回self. reject!就有所不同,若未删除元素时返回nil,除此之外则返回self.
9、each、each_pair
each {|key, value| ... }、each_pair {|key, value| ... }
以key和value为参数对块进行计算.返回self.
例:
{:a=>1, :b=>2}.each_pair {|k, v| p [k, v]}
# => [:a, 1]
[:b, 2]
each和each_pair的块参数交接方法有所不同.
each: yield([key, val])
each_pair: yield(key, val)
10、each_key
each_key {|key| ... }
以key为参数来计算块.返回self.
11、each_value
each_value {|value| ... }
以value为参数来计算块.返回self.
12、empty?
若哈希表为空则返回真.
13、fetch
fetch(key[, default])、fetch(key) {|key| ... }
返回与索引key对应的元素的值.若该索引未被注册则分为两种情况: 若给出了参数default的话,就返回它的值;若给出了块时,将返回块的计算值.除此之外将引发IndexError异常.
14、has_key?、include?、key?、member?
has_key?(key)、include?(key)、key?(key)、member?(key)
若key是哈希表的索引则返回真.
15、has_value?、value?
has_value?(value)、value?(value)
若value是哈希表的元素值则返回真.对值进行判断时使用==操作符.
16、index
index(val)
返回与val对应的索引.若无法对应时返回nil。若有若干个对应的索引时,则会随机地返回其中之一.
17、indexes、indices
indexes(key_1, ... , key_n)、indices(key_1, ... , key_n)
以数组的形式返回与参数所指的索引相对应的元素值.
18、invert
将元素值和索引互换,返回变换后的哈希表.若原哈希表中若干不同的索引对应相同的元素值时,其变换结果将无法预测.
例:
h = { "n" => 100, "m" => 100,"y" => 300, "d" => 200, "a" => 0 }
h.invert #=>{200=>"d", 300=>"y", 0=>"a",100=>"n"}
19、keys
返回一个包含所有索引的数组.
20、length、size
返回哈希表中的元素的个数.
21、merge
merge(other)
merge(other) {|key, self_val, other_val| ... }
merge!(other)
merge!(other) {|key, self_val, other_val| ... }
Hash#merge等同于hash.dup.update.而Hash#merge!则是Hash#update的别名.
当self和other中包含相同索引时将按照下列两种方式来处理: 若带块则调用该块,然后由用户选择使用哪个值;不带块的话则通常使用other的值.
22、rehash
重新计算索引对应的哈希表值。当与索引对应的哈希表值发生变化时,若不使用该方法来重新计算的话,将无法取出与索引对应的哈希表值。
23、replace
replace(other)
以other的内容来替换哈希表的内容。返回self。
24、to_a
生成并返回一个数组,数组中的元素也是数组,且由[key,value]构成。
25、to_hash
返回self。
26、update
update(other)、update(other){|key, self_val, other_val| ... }
合并哈希表的内容。若出现相同索引时,将使用other中对应的元素值。
例:
foo = {1 => 'a', 2 => 'b', 3 => 'c'}
bar = {1 => 'A', 2 => 'B', 3 => 'C'}
p foo.dup.update(bar) # =>{1=>"A", 2=>"B", 3=>"C"}
p foo.dup.update(bar) {|k,v| v} # => {1=>"a",2=>"b", 3=>"c"}
返回self。
27、values
返回一个包括哈希表中的所有元素值的数组。
28、values_at(key_1, ... ,key_n)
返回一个数组,该数组包括与参数所指索引相对应的哈希表元素值。若没有与索引相对应的哈希表元素值时,将使用default的值。与indexes以及indices相同。
例:
h = {1=>"a", 2=>"b", 3=>"c"}
ph.values_at(1,3,4) # =>["a", "c", nil]