lua
lua对于大型程序块和大型字符串的处理不会有任何问题. 几兆字节的程序块,大到容纳一本书的字符串都可以正确处理.
默认的函数递归层次在16000层左右,仅仅只是简单的函数调用,没有任何的处理逻辑或者局部变量声明. 但是嵌套层次也已经足够多了,只要不是太胡来,基本不用担心.
哑变量_,本身也是变量,是要占用内存的,可以输出哑变量的值,像这样print(_). 功能基本类似于匿名变量,好处在于不需要为不需要的变量起一个有意义的名字. 接收函数多重返回值的时候,非常有用.
加载其他lua文件,可以使用dofile或者loadfile,参数是lua文件的path字符串.
dofile加载即执行,loadfile需要显示调用才会执行.
require加载lua模块.
所有传给lua脚本的参数,都会被保存到名为arg的table中,下标为0的索引的值是lua脚本文件名.
lua中的类型
lua是动态类型的语言,变量本身没有类型,每个值都携带了自身的类型信息.
type可以返回当前值的类型的字符串表示.
lua没有整型值,因为双精度浮点型足以精确表示整型数值,不会出现"四舍五入"的错误.
tonumber和tostring,两个非常实用的函数.字符串转换成数值可能会引发异常(如果是非数值型字符串)
lua中#放在数组的前面,可以返回数组的长度,其实是最后一个元素的索引.
没有空隙的数组可以用#操作符获取当前数组的长度.
如果是有空隙的数组,可以调用table.maxn来返回当前线性表的最大正向索引数.
for,break,return
数值型的for循环,三个表达式的值,是循环开始前一次性求值的,表达式中的函数调用只会执行一次. 这一点和java,c++等其他语言的for循环不同. 所有的循环变量,都是在for循环内部局部可见.
泛型for,ipairs用于遍历数组,pairs用于遍历table,io.lines用于遍历文件中的每一行. string.gmatch用于遍历字符串中的单词.
break和return只能是一个块的最后一条语句,不过可以在任意位置用do end把return包起来, 就可以避免lua解释器的检查.
lua中的函数
lua中的函数,本质就是一个普通的变量,可以像普通变量一样赋值或者改变函数的行为.
如果table对象作为参数,lua会引用外部的table对象进行函数内部的处理.
lua中的对象还有userdata,function类型的实体等.
普通变量,仍然是赋值拷贝.
可变参数,在函数内部可以用ipairs遍历所有的参数.
select('#',...)返回可变参数的个数,参数中可能有nil值,不用用泛型for来遍历, 可以用select获取可变参数的个数,然后是数值for循环来遍历.
参数过多的时候,可以把相关的参数收集到一个table里面,控制参数的个数.