hash 表使用总结

哈希表(也叫散列表)的类.通过哈希表,您可以将一个任意类型的对象同另一个任意类型的对象联系起来.可以使用下列哈希表表达式来生成哈希表.
{a=>b, ... }

通常使用Object#hash方法来计算哈希表的值,而使用Object#eql?方法来判定索引是否相同.
若用作索引的对象的内容发生了变化,且hash方法的返回值也有所不同时,将无法取出哈希表中的值.所以Array、Hash等的实例并不面向索引对象本身. 例如,若将字符串作为索引时,将先拷贝该字符串,然后把拷贝设为只读(freeze),最后将该拷贝用作索引.若想更改索引字符串的内容时,将引发TypeError异常.
哈希表的建立:
Hash[key,value,...]
Hash[hash]
从数组生成哈希表的方法示例(可能您觉得应该有更直接的方法,但实际上并没有)
1.由[索引, 值, ...] 型的数组变为哈希表
ary = [1,"a", 2,"b", 3,"c"]
p Hash[*ary]

# => {1=>"a", 2=>"b", 3=>"c"}

2.由索引和值配对出现的数组变为哈希表
alist = [[1,"a"], [2,"b"], [3,"c"]]
p Hash[*alist.flatten]

#=> {1=>"a", 2=>"b", 3=>"c"}

3.由索引数组和值数组配对生成哈希表(version 1.7 以后)
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"}

4.虽然索引和值都是数组,但还是无法使用(2)或(3)的方法时,只好老老实实地赋值了
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| ...} ((<ruby 1.7 特性>))

生成一个全新的空哈希表.若索引没有对应值时,其默认值为ifnone.您必须谨慎地处理默认值的问题(trap::Hash).
ruby 1.7 特性:若指定了块时,则块的计算值将成为默认值.每当调用无值的哈希表元素时,都会对块进行计算,然后返回其结果.而调用哈希表时的索引将被传递给该块.

# 若没有使用块时, 一旦改变默认值将会
# 影响到其他的值
h = Hash.new("foo")
p h[1]                  # => "foo"
p h[1] << "bar"         # => "foobar"
p h[1]                  # => "foobar"
p h[2]                  # => "foobar"


# 若使用块的话,问题便会迎刃而解
h = Hash.new {|hash, key| hash[key] = "foo"}
p h[1]                  # => "foo"
p h[1] << "bar"         # => "foobar"
p h[1]                  # => "foobar"
p h[2]                  # => "foo"

# 若元素无值时,可以(像fetch一样)抛出异常
h = Hash.new {|hash, key|
                raise(IndexError, "hash[#{key}] has no value")
             }
h[1]
# => hash[1] has no value (IndexError


你可能感兴趣的:(C++,c,C#,Ruby)