hash
创建
# 引用
irb(main):044:0> a={key:'value'} # 这种情况下key是sybol类型,所以取它的值时a[:key]
=> {:key=>"value"}
irb(main):045:0> b =a
=> {:key=>"value"}
irb(main):046:0> b.object_id
=> 70368301765400
irb(main):047:0> a.object_id
=> 70368301765400
irb(main):049:0> a[:key]='foo'
=> "foo"
irb(main):050:0> b
=> {:key=>"foo"}
# 指定初始值
irb(main):053:0> h=Hash.new(3)
=> {}
irb(main):054:0> h[0]
=> 3
irb(main):055:0> h[1]
=> 3
irb(main):056:0> h
=> {}
#初始值只是一份引用,当中途改变时,后面创建的也都会改变
irb(main):057:0> h = Hash.new([])
=> {}
irb(main):058:0> h[:a]<<1
=> [1]
irb(main):059:0> h[:b]
=> [1]
# 生成不同的值,与array类似,要使用block来实现
irb(main):060:0> h =Hash.new{|h,k| h[k]=[]}
=> {}
irb(main):061:0> h[:a] << 1
=> [1]
irb(main):062:0> h
=> {:a=>[1]}
irb(main):063:0> h[:b]
=> []
irb(main):064:0> h
=> {:a=>[1], :b=>[]}
irb(main):065:0> h[:c]=3 # 赋值
=> 3
irb(main):066:0> h
=> {:a=>[1], :b=>[], :c=>3}
irb(main):067:0> h.delete(:b) # 删除
=> []
irb(main):068:0> h
=> {:a=>[1], :c=>3}
irb(main):069:0> h.assoc(:c) # 同时取key,value
=> [:c, 3]
irb(main):070:0> h.empty? # 是否为空
=> false
irb(main):071:0> h.has_value?(2) # 是否有某值
=> false
irb(main):072:0> h.has_key?(:c) # 是否有某键
=> true
irb(main):073:0> h.keys # 所有的键
=> [:a, :c]
irb(main):074:0> h.values # 所有值
=> [[1], 3]
irb(main):075:0> h.to_a # 转成数组
=> [[:a, [1]], [:c, 3]]
irb(main):076:0> h2={d:4}
=> {:d=>4}
irb(main):077:0> h.merge(h2) # 合并
=> {:a=>[1], :c=>3, :d=>4}
# 遍历 ,遍历的顺序是插入的顺序
irb(main):079:0> h.each{|k,v| p [k,v]} # 遍历键值
[:a, [1]]
[:c, 3]
=> {:a=>[1], :c=>3}
irb(main):080:0> h.each_key {|k| p k} # 遍历键
:a
:c
=> {:a=>[1], :c=>3}
irb(main):081:0> h.each_value {|v| p v} # 遍历值
[1]
3
=> {:a=>[1], :c=>3}
irb(main):082:0> h.select{|k| k==:a}
=> {:a=>[1]}