曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3174|回复: 0
打印 上一主题 下一主题

pairs 和 ipairs

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2014-11-20 13:57:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Lua 的基础库中提供了 pairs 和 ipars 两个函数,它们分别用于遍历 table 和 数组。

这里所说的数组,是索引值为 1,2,3,4...整数的数组,比如下面代码示例:
  1. days = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"};
  2. for i, v in ipairs(days) do
  3.         print(i, v);
  4. end
复制代码


程序会输出:
1        sunday
2        monday
3        tuesday
4        wednesday
5        thursday
6        friday
7        saturday

在每次循环中,i 会被赋予一个索引值,同时 v 被赋予一个对应于该索引的数组元素值。

对于上面程序,将 iparis() 函数换成 pairs() 仍然有效。但是,如果将 days 这种普通的数组换成 table 样式,如:
Days = {["sunday"]=1, ["monday"]=2, ["tuesday"]=3, ["wednesday"]=4, ["thursday"]=5, ["friday"]=6, ["saturday"]=7};

在这种情况下,ipairs() 将无法输出任何内容。如果注意到,ipairs() 和 pairs() 前面只有一个字母 'i' 的区别,i 实际是整数 integer 的头字母,也就意味着这个函数是用来遍历索引值为正数的数组。因此,对于 Days 这种 table ,我们需要用 pairs() 来遍历它,比如:
  1. Days = {["sunday"]=1, ["monday"]=2, ["tuesday"]=3, ["wednesday"]=4, ["thursday"]=5, ["friday"]=6, ["saturday"]=7};
  2. for i, v in pairs(Days) do
  3.         print(i, v);
  4. end
复制代码


输出结果:
saturday        7
tuesday        3
wednesday         4
friday                6
sunday        1
thursday        5
monday        2

然而,这个并非如你想象的那样,是顺序输出的。因此可以想象,table 中的这些 key 和 value 是如哈希表一样存放数据。若你希望按照顺序输出,那么需要自己用程序来处理,比如:
  1. Days = {["sunday"]=1, ["monday"]=2, ["tuesday"]=3, ["wednesday"]=4, ["thursday"]=5, ["friday"]=6, ["saturday"]=7};
  2. i = 1;

  3. function print_kv (Days)
  4.         for k, v in pairs(Days) do
  5.                 if v == i then
  6.                         i = i + 1
  7.                         print (k, v)                                       
  8.                 end               
  9.         end               

  10. end

  11. while (i ~= 8) do       
  12.         print_kv ( Days )
  13. end
复制代码


运行输出:
i = 1;

function print_kv (Days)
        for k, v in pairs(Days) do
                if v == i then
                        i = i + 1
                        print (k, v)                                       
                end               
        end               

end

while (i ~= 8) do       
        print_kv ( Days )
end

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 17:02 , Processed in 0.073004 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表