在看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。
阅读(1222) | 评论(0) | 转发(0) |