=begin
哈希,哈希是一种类似字典的集合,集合中包含了唯一的键(key)和键所对应的值(value),键具有唯一性
=end
#新建一个Hash
ha = { "a" => 1, "b" => 2 } #新建一个Hash
ha = { a:1, b:2 } #新建一个Hash,建议使用这种方法
ha = Hash.new(0) #为Hash设置一个默认值0,不传入则为nil
ha.default #使用default方法输出此hash的默认值
ha = Hash.new { |hash, key| hash[key] = "不存在键#{key}" } #设置更详细的Hash的默认值
p ha[:not_exit]
#Hash的基本用法----获得Hash的信息
ha1 = { a:1, b:2 }
ha1.default #返回Hash的默认值:nil
ha1.empty? #判断Hash是否为空:false
ha1.eql?({a:1, b:2}) #判断与其他的Hash是否相等:true
ha1.length #返回Hash的长度:2
ha1.size #返回Hash的长度:2
ha1.clear #清空Hash,会修改原Hash
#Hash的基本用法----访问Hash中的键值对
ha2 = { a:1, b:2 }
ha2[:a] #返回键多对应的值:1;在没有设置默认值的情况下,如果输入一个不存在的键时则返回nil
ha2.fetch(:a) #返回键多对应的值:1;如果输入一个不存在的键时则直接报错:raise keyError
ha2.has_key?(:a) #检查Hash中是否存在:a这个键,返回值为布尔类型:true
ha2.key(2) #返回值所对应的键:b
ha2.keys #返回Haah中所有的键:[:a, :b]
ha2.values #返回Hash中所有的值:[1, 2]
ha2.assoc(:a) #将Hash中某个键和键所对应的值组合为数组:[:a, 1]
#Hash的基本用法-向Hash中增加键值对
ha3 = { a:1, b:2 }
ha3[:c] = 3 #向Hash中增加键值对:{:a=>1, :b=>2, :c=>3}
ha3.store(:d, 4) #向Hash中增加键值对:{:a=>1, :b=>2, :c=>3, :d=>4}
ha3.merge({ e:5 }) #向Hash中增加键值对,不会修改原Hash:{:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}
ha3.update({ e:5 }) #向Hash中增加键值对:{:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}
#Hash的基本用法-删除Hash中的特定键值对
ha4 = { a:1, b:2, c:3, d:4, e:5 }
ha4.delete(:a) #删除键和键所对应的值:{:b=>2, :c=>3, :d=>4, :e=>5}
ha4.delete_if { |key, value| value > 4 } #遍历Hash,删除满足条件的键和键所对应的值:{:b=>2, :c=>3, :d=>4}
ha4.keep_if { |key, value| value < 4 } #遍历Hash,只保留满足条件的键和键所对应的值:{:b=>2, :c=>3}
ha4.shift #删除第一个键和键所对应的值,shift的返回值是一个数组:[:b, 2]
#Hash的基本用法----遍历Hash中的键值对
ha5 = { a:1, b:2 }
ha5.each { |key, value| puts key, value } #遍历Hash:a\n1\nb\n2\n
ha5.each_pair { |key, value| puts key, value } #遍历Hash:a\n1\nb\n2\n
ha5.each_key { |key| puts key } #遍历Hash中所有的键:a\nb\n
ha5.each_value { |value| puts value } #遍历Hash中所有的值:1\n2\n
ha5.select { |key, value| value < 2 } #筛选出值小于2的键和与之对应的值,不会修改原Hash:{:a =>1}
ha5.reject { |key, value| value < 2 } #筛选掉值小于2的键和与之对应的值后剩下的键和与之对应的值,不会修改原Hash:{:b =>2}
#Hash的基本用法----一些特殊用法
ha6 = { a:1, b:2, c:3, d:{ e:5, f:6 }, "g" => 7 }
ha6.flatten #将Hash转化为对应的数组:[:a, 1, :b, 2, :c, 3, :d, {:e=>5, :f=>6}, "g", 7]
ha6.invert #将Hash中的键与值对调:{1=>:a, 2=>:b, 3=>:c, {:e=>5, :f=>6}=>:d, 7=>"g"}
ha6.to_a #将Hash转化为对应的数组,每个键值对会生成一个子数组:[[:a, 1], [:b, 2], [:c, 3], [:d, {:e=>5, :f=>6}], ["g", 7]]
ha6.to_s #直接输出Hash结构,适用于生成log:"{:a=>1, :b=>2, :c=>3, :d=>{:e=>5, :f=>6}, \"g\"=>7}"