哈希表是一种和数组比较类似的数据结构。
哈希表也称为关联数组。和数组不同的是,可以使用任意的对象作为取出值的主键(相当于数组的下标)。在 {} 符号中间排列多个元素就生成了一个哈希表。
a = {"阿莱库斯"=>2000, "杰克"=>2003}
这个例子中,"阿莱库斯" 和 "杰克" 就是取出数值的主键,2000 和 2003 就是实际的值。直接生成哈希表时就这样使用 => 符号把主键和数值连接起来。
要取出哈希表中对象的时候,应按如下操作。
a = {"阿莱库斯"=>2000, "杰克"=>2003} p a["阿莱库斯"] # => 2000 p a["杰克"] # => 2003 p a["小白兔"] # => nil
从上例最后一行可以得知,当指定主键不存在时就会返回 nil。
这里是以字符串为主键,当然不使用字符串也可以。 即使主键只需要整数,编号不连续时使用哈希表会比使用数组更加方便。
另外,哈希表的反操作,也就是「检查与数值对应的主键」的情况下, 在 [] 中写入数值是不能得到其主键的。这里不再多作陈述, 要进行这种操作用到的是另一个方法。
实际操作中,比起在程序中直接指定数据来生成哈希表,更多的是先建立一个空的哈希表,然后向其中逐渐添加数据。生成一个空的哈希表只需写 {} 即可。
a = {}
向哈希表中添加值,和数组元素的赋值完全相同。
a = {} a["阿莱库斯"] = 2000 p a # => {"阿莱库斯"=>2000}
哈希表是 Hash 类的对象。 同数组一样,可以调用这个类定义的方法对数据进行操作。
比如要从哈希表中删除数值的话,就要使用 delete 方法。
a = {"阿莱库斯"=>2000, "杰克"=>2003} a.delete("杰克") p a # => {"阿莱库斯"=>2000}
想知道哈希表中是否含有某个特定主键的情况下,就要使用 include? 方法。
a = {"阿莱库斯"=>2000, "杰克"=>2003} p a.include?("阿莱库斯") # => true p a.include?("小白兔") # => false
第三行中使用 include? 方法,是确认哈希表中是否含有主键 "阿莱库斯"。 上例在第一行生成哈希表时主键设有 "阿莱库斯",所以输出结果为 true(真)。 同样第四行是确认哈希表中是否含有主键 "小白兔"。 然而这个主键在哈希表中是不存在的,所以输出结果就为 false(伪)。
在哈希类中,有取得全部主键构成的数组的 keys 方法。
a = {3=>6, 4=>10, 5=>15} p a.keys # => [3, 4, 5]
这样就会输出 => 左侧的主键构成的数组。
前一章数组的最后使用了迭代器,我们使用这个来对哈希表的主键进行循环。
a = {3=>6, 4=>10, 5=>15} a.keys.each do |k| p k end
执行这段代码会输出 3, 4, 5。
此外,使用 values 方法可以获得哈希表的值构成的数组。
a = {3=>6, 4=>10, 5=>15} a.values.each do |v| p v end
执行这段代码会输出 6, 10, 15。
此外,旧版本的 Ruby 哈希表的存储顺序是不确定的。但 RGSS3 使用的 Ruby 1.9 开始确保了哈希表的顺序。
a = {3=>6, 5=>15, 4=>10} a.keys.each do |k| p k end
像这样更改了输入顺序,输出的顺序也会变为 3, 5, 4。