rpg家园吧 关注:66贴子:180
  • 0回复贴,共1

RPG MAKER 脚本入门------Hash 表

只看楼主收藏回复

Hash 表是一种和数组比较类似的数据构造形式。 

Hash 表的生成 
Hash 表也称为关联数组。和数组不同的是,作为取出数值 的主键(相当于数组的附加码),可以使用任意的对象。 在 {} 符号中间排列多个单元就生成了一个哈希表。 

a = {"艾力克斯"=>2000, "杰克"=>2003} 
这个例子中,"艾力克斯" 和 "杰克" 就是取出数值的主 键,2000 和 2003 就是实际的数值。这样, 使用 => 符号把主键和数值连接起来就形成了 Hash 表。 

要取出 Hash 表中对象的时候,应按如下操作。 

a = {"艾力克斯"=>2000, "杰克"=>2003} 

p a["艾力克斯"] # => 2000 
p a["杰克"] # => 2003 
p a["宇佐助"] # => nil 
从上例最后一行可以得知,当指定主键不存在时就会返回 nil。 

这里是以字符串为主键,当然不使用字符串也可以。作为主键还可以使用整数等其它数据类型,在有很多编号单元的情况下使用哈希表会比使用数组更加方便。 

另外,哈希表的反操作,也就是「检查与数值对应的主键」的情况下,在 [] 中写入数值是不能得到其主键的。这里不再多作陈述,该种操作方法我们会在后面特别介绍。 

Hash 表数值的添加 
实际操作中,Hash 表可以在程序中直接指定数据建立, 亦可以使用先建立一个空的 Hash 表然后向其中添加单元数据等多种方法生成。 生成一个空的 Hash 表只需写入 {} 就行了。 

a = {} 
向 Hash 表中添加数值,和数组单元的重赋值完全相同。 

a = {} 
a["艾力克斯"] = 2000 

p a # => {"艾力克斯"=>2000} 
Hash 表的操作 
Hash 表是 Hash 类的对象。 同数组一样,可以调用这个类定义的方法对数据进行操作。 

比如要从 Hash 表中删除数值的话,就要使用 delete 方法。 

a = {"艾力克斯"=>2000, "杰克"=>2003} 
a.delete("杰克") 

p a # => {"艾力克斯"=>2000} 
想知道 Hash 表中是否含有某个特定主键的情况下,就要使用 include? 方法。 

a = {"艾力克斯"=>2000, "杰克"=>2003} 

p a.include?("艾力克斯") # => true 
p a.include?("宇佐助") # => false 
第三行中使用 include? 方法,是确认哈希表中是否含有主键 "艾力克斯"。上例在第一行生成哈希表时主键设定有 "艾力克斯",所以输出结果为 true(真)。同样第四行是确认哈希表中是否含有主键 "宇佐助"。然而这个主键在哈希表中是不存在的,所以输出结果就为 false(伪)。 

Hash 表的循环 
在 Hash 类中,有取得全部主键排列的 keys 方法。 

a = {3=>6, 4=>10, 5=>15} 
p a.keys # => [5, 3, 4] 
这样,=> 左侧的主键会全部排列出来。 但 Hash 表中是没有顺序的,所以排列会无顺序可言。 

前节中,我们学习了使用 for 循环指定数组的方法。 现在让我们来用 for 循环指定 keys 方法的返回值,作成 Hash 表主键的循环吧。 

a = {3=>6, 4=>10, 5=>15} 

for k in a.keys 
 p k 
end 
运行上例就会按不同顺序显示 3、4、5。 

而且,使用 values 方法的话,还能取得 Hash 表全部数值的排列。 

a = {3=>6, 4=>10, 5=>15} 

for v in a.values 
 p v 
end 
运行上例就会按不同顺序显示 6、10、15。 


1楼2008-02-18 13:40回复