Ruby语言入门(15)- 内部类 -Hash

上一篇 / 下一篇  2013-02-04 15:12:48 / 个人分类:语言

哈希表(也叫散列表)的类.通过哈希表,您可以将一个任意类型的对象同另一个任意类型的对象联系起来.

可以使用下列哈希表表达式来生成哈希表: {a=>b, ... }(key=>value)

通常使用Object#hash方法来计算哈希表的值,而使用Object#eql?方法来判定索引是否相同.

Hash[key,value,...]
Hash[hash]
生成新的哈希表.使用第一种形式时,参数的个数必须是偶数.(奇数位参数是索引,偶数位参数是元素值).使用第二种形式(将一个哈希表对象指定给参数)时, 将生成并返回一个与指定哈希表相同的全新的哈希表.(生成的哈希表的默认值为nil.)

以下是从数组生成哈希表的方法示例:

由[索引, 值, ...] 型的数组变为哈希表
ary = [1,"a", 2,"b", 3,"c"]
puts Hash[*ary]
=> {1=>"a", 2=>"b", 3=>"c"}
puts Hash[ary]
=>{}

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

由索引数组和值数组配对生成哈希表
keys = [1, 2, 3]
vals = ["a", "b", "c"]
alist = keys.zip(vals)   # 或 alist = [keys,vals].transpose
puts Hash[*alist.flatten]
=> {1=>"a", 2=>"b", 3=>"c"}

无法使用上述的方法时:
h = Hash.new
alist = [[1,["a"]], [2,["b"]], [3,["c"]]]
alist.each {|k,v|
  h[k] = v
}
puts h
=> {1=>["a"], 2=>["b"], 3=>["c"]}

Hash.new([ifnone])
Hash.new {|hash, key| ...} 
生成一个全新的空哈希表.若索引没有对应值时,其默认值为ifnone.若指定了块时,则块的计算值将成为默认值.每当调用无值的哈希表元素时,都会对块进行计算,然后返回其结果.而调用哈希表时的索引将被传递给该块.

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

若使用块的话,不会出现这种问题
h = Hash.new {|hash, key| hash[key] = "foo"}
puts h[1]                  # => "foo"
puts h[1] << "bar"         # => "foobar"
puts h[1]                  # => "foobar"
puts h[2]                  # => "foo"

self[key]
返回索引为key的哈希表元素的值.若该索引并未注册,则返回默认值(若未设定则为nil).若想区分该nil到底是默认值还是哈希表元素值时,请使用fetch.

h = Hash.new {|hash, key| hash[key] = "foo"}
puts h[1]
=>"foo"

self[key]=value
store(key,value)
将索引为key的元素值设为value.返回value.

h[2]="fool"
h[2]
=>"fool"
h.store(3,"test")
h[3]
=>"test"

clear
清空哈希表的内容. 返回self.

h.clear
=>{}

clone
dup
返回一个与receiver内容一致的新哈希表. 对冻结的哈希表进行clone时将返回一个同样的冻结的哈希表.但使用dup时,将返回内容相同但却并未冻结的哈希表.

b=h.clone
b[1]
=>"foo"

default
default([key])
返回哈希表的默认值.

h.default
=>nil
h.default("123")
=>foo
h("123")
="foo"

default=value
将哈希表的默认值设为value.若使用无对应值的索引进行搜索时,将返回该值.

h.default="test"
h.default
=>"test"
h[10]
=>"test"

default_proc
返回一个Proc对象,该对象负责返回哈希表的默认值.若没有默认的Proc时将返回nil.

h = Hash.new {|h, k| }
puts h.default_proc        
=> #<Proc:0x0x401a9ff4>

h = Hash.new(1)
puts h.default_proc        
=> nil

delete(key)
delete(key) {|key| ... }
删除索引key与对应元素之间的关系.返回被删除的值.若没有值与key相对应,则返回nil.若给出块的话,将在key匹配失败时对块进行计算,然后返回其结果.

h
=> {1=>"test",2="test",3=>"test"}
h.delete(2)
h
=> {1=>"test",3=>"test"}

reject {|key, value| ... }
拷贝self之后对块进行计算,若计算值为真则删除相应的哈希表元素,最后返回该哈希表.

delete_if {|key, value| ... }
reject! {|key, value| ... }
把key和value当做参数来计算块,若计算值为真则删除相应的元素.通常delete_if返回self. reject!就有所不同,若未删除元素时返回nil,除此之外则返回self.


each {|key, value| ... }
each_pair {|key, value| ... }
以key和value为参数对块进行计算.返回self.

{:a=>1, :b=>2}.each_pair {|k, v| puts [k, v]}

=> [:a, 1]
   [:b, 2]

each_key {|key| ... }
以key为参数来计算块.返回self.

each_value {|value| ... }
以value为参数来计算块.返回self.

empty?
若哈希表为空则返回真.

fetch(key[, default])
fetch(key) {|key| ... }
返回与索引key对应的元素的值.若该索引未被注册则分为两种情况: 若给出了参数default的话,就返回它的值;若给出了块时,将返回块的计算值

has_key?(key)
include?(key)
key?(key)
member?(key)
若key是哈希表的索引则返回真.

has_value?(value)
value?(value)
若value是哈希表的元素值则返回真.对值进行判断时使用==操作符

index(val)
返回与val对应的索引.若无法对应时返回nil.若有若干个对应的索引时,则会随机地返回其中之一.

invert
将元素值和索引互换,返回变换后的哈希表.
h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
h.invert
=> {200=>"d", 300=>"y", 0=>"a", 100=>"n"}

keys
返回一个包含所有索引的数组.

length
size
返回哈希表中的元素的个数.

merge(other)
merge(other) {|key, self_val, other_val| ... }
merge!(other)
merge!(other) {|key, self_val, other_val| ... }
合并两个hash表。当self和other中包含相同索引时将按照下列两种方式来处理: 若带块则调用该块,然后由用户选择使用哪个值;不带块的话则通常使用other的值.

rehash
重新计算索引对应的哈希表值。当与索引对应的哈希表值发生变化时,若不使用该方法来重新计算的话,将无法取出与索引对应的哈希表值。

replace(other)
以other的内容来替换哈希表的内容。返回self。

shift
删除一个哈希表元素后,再以[key,value]数组的形式将其返回。

to_a
生成并返回一个数组,数组中的元素也是数组,且由[key,value]构成。

to_hash
返回self。

update(other)
update(other) {|key, self_val, other_val| ... } 
合并哈希表的内容。若出现相同索引时,将使用other中对应的元素值。若给出了块的话,每当遇到相同索引时都会对块进行计算,然后以块的计算值作为该索引的对应值。此时,索引、self[key] 和other[key]将被作为参数传递给该块。

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"}

values
返回一个包括哈希表中的所有元素值的数组。

values_at(key_1, ... , key_n)
返回一个数组,该数组包括与参数所指索引相对应的哈希表元素值。若没有与索引相对应的哈希表元素值时,将使用default的值。与indexes以及indices相同。



TAG:

 

评分:0

我来说两句

日历

« 2024-04-16  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 150223
  • 日志数: 185
  • 文件数: 6
  • 建立时间: 2007-08-06
  • 更新时间: 2015-01-06

RSS订阅

Open Toolbar