Chinaunix首页 | 论坛 | 博客
  • 博客访问: 674027
  • 博文数量: 132
  • 博客积分: 10060
  • 博客等级: 上将
  • 技术积分: 1732
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-21 12:35
个人简介

迷惘的码农。

文章分类

全部博文(132)

文章存档

2013年(1)

2011年(2)

2010年(9)

2009年(41)

2008年(79)

我的朋友

分类:

2008-07-17 22:57:57

在看Progaming in Lua第一版。

1. 章节3.3讲述逻辑运算符,提供了一个模拟C中3元运算符的技巧:
(a and b) or c  --> a ? b : c
我感觉这样不太妥当,某些情况可能致错,虽然不一定常见,即:
(1 and nil) or 2
此时表达式结果为2(c),而不是nil(b);
原因很好理解,3元运算符带有分支的特性,任何情况下(2种)都只执行2个表达式,
但是Lua的模拟表达式不带分支,是顺序结构,只是根据(计算顺序)前面的子表达式的值,
选择性地执行后面的字表达式,所以可能执行部分甚至全部子表达式,因此不能用于所有情况;

2. 一直感觉lua的数组(使用整数索引的表)很奇怪,在学习的过程中,
看到介绍数组长度的那部分很迷惑,为什么那么复杂呢,要考虑多种情况?
不知道v5.1是否进行了简化;
而且,同时存在其他类型key时,获取长度的方法(或者#运算符)将它们忽略,只计算整数索引,
因此,无论含有多少元素,只要没有整数索引,#t == 0,
这样如何取得表(非数组)的长度呢?
另外,函数ipairs和pairs的区别也要注意:
前者忽略非整数key,遍历顺序是依照索引顺序,在碰到第一个nil处停止,因此中间不能出现空穴;
后者可用于全部类型的key,遍历顺序嘛,似乎是存储顺序,因为整数索引的元素是单独存储的,
因此首先遍历它们,然后才是一般存储的其他元素(有待深入研究!!!)。
当我们需要按照索引顺序遍历带有空穴的数组,可以这样做:
function my_it(t)
 n = #t
 i = 0
 return function()
  if i >= n then return nil end
  i = i + 1
  return i, t[i]
 end
end

for i,v in my_it(t) do
 print(i, v)
end

3. 范型迭代的迭代子,要结束遍历,只能让第一个返回值(控制变量)为nil,不可为false。



阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~