携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
一、Hash 类型
Ruby 中的散列表 Hash 类型是一种 K-V 类型的数据,在其他编程语言中也被称为 Map 或者 字典 Dict。Hash 类型与数组一样都是一种带有索引的数据对象的集合,数组的索引只能是整数,而 Hash 类型的索引则可以是任意对象,且 Hash 是无序的。
散列表中作为索引的对象称之为键(Key),而其对应的对象称之为值(Value),散列表所包含的就是键和值的直接对应的关系,散列表也称为 Hash 表。
散列表的定义
Ruby 中的散列表既 Hash 类,创建散列表可以使用 Hash 类的构造方法:
h = Hash.new
也可以使用 Hash 类的构造方法 []:
h = Hash["name" => "Stark", "age" => "33"]
Ruby 散列表中的键和值的对应关系是通过 => 来表示,其他语言中通过 : 来表示键和值,散列表的表示方式使用 {} 来表示:
h = {"name" => "Stark", "age" => "33"}
散列表中值的获取可以通过 [] 方式来获取,如果 Key 存在返回 nil,也可以通过 [] 增加新的键值对或者给已有的键重新赋值。
info = {"name" => "tony", "age" => "33"}
puts info["name"]
puts info["address"]
info["address"] = "NYC"
puts info
info["name"] = "TONY"
puts info
执行上述代码,输出结果如下:
tony
{"name"=>"tony", "age"=>"33", "address"=>"NYC"}
{"name"=>"TONY", "age"=>"33", "address"=>"NYC"}
虽然散列表支持使用任何对象作为 Key,但通常情况下推荐使用 Symbol 符号对象作为 Key,应为符号是引用数据类型,可以保证任何情况下相同的名称符号都是引用的同一个值。
二、散列表的常用方法
散列表的常用方法如下:
hash.clear:清空散列表,删除所有的键和值hash.delete(key):删除散列表中指定的键和值hash.delete_if{|k,v| block}:删除 block 代码返回 true 的键和值hash.has_key(key):判断散列表是否包含指定的 Keyhash.has_value(val):判断散列表是否包含指定的 valuehash.invert:返回逆转散列表的键和值的新的散列表,既键和值位置互换hash.keys:返回由所有的键组成的数组hash.values:返回由所有的值组成的数组hash.values_at(keys):返回给定键对应的值组成的数组hash.length:返回散列表的长度hash.merge(other_hash):合并两个散列表,如果有重复的键,将使用other_hash 中的键的值覆盖旧的散列表中的值hash.replace(other_hash):使用 other_hash 中的值替换原散列表中相同键的值hash.to_a:将散列表转换成数组
info = {:name => "tony", :age => "33"}
info.clear
puts info
info = {:name => "tony", :age => "33"}
info.delete(:age)
puts info
score = {:tony => 50, :tom => 70, :bob => 80}
puts score.delete_if{|k,v| v < 60}
info = {:name => "tony", :age => "33"}
puts info.has_key?(:name)
puts info.has_value?("tony")
puts info.index("33")
puts info.invert
info = {:name => "tony", :age => "33"}
puts info.length
puts (info.keys).class
puts (info.keys).to_s
puts (info.values).class
puts (info.values).to_s
puts info.values_at(:name)
info = {:name => "tony", :age => "33"}
address = {:city => "NYC", :street => "5th Avenue"}
puts info.merge(address)
info = {:name => "tony", :age => "33"}
info1 = {:name => "TONY", :age => 33, :add => "NYC"}
puts info.replace(info1)
puts (info.to_a).class
puts (info.to_a).to_s
执行上述代码,输出结果如下:
{}
{:name=>"tony"}
{:tom=>70, :bob=>80}
true
true
age
{"tony"=>:name, "33"=>:age}
2
Array
[:name, :age]
Array
["tony", "33"]
tony
{:name=>"tony", :age=>"33", :city=>"NYC", :street=>"5th Avenue"}
{:name=>"TONY", :age=>33, :add=>"NYC"}
Array
[[:name, "TONY"], [:age, 33], [:add, "NYC"]]