Lua 笔记-lua的与众不同处
不需要 “ ;”分隔符
> a = 1 > b = a + 1
lua中换行不起任何作用。
标识符
可以任意字母,数字和下划线构成,但不能以数字开头。
通常保留标识符一个或者多个“_”下划线和
变量无需声明类型,无需在首次使用前声明大写字母的使用,它们保留做特殊用途。
注释
单行注释:“--”
多行注释:“ - -[[…]]- -“
全局变量不需要声明
访问未声明的变量不会报出
> print(b) nil
对于生命周期比较短的变量应该用局部变量,用 local 声明
不需要事先声明变量类型
lua是一种动态语言,没有类型定义的语法
变量可以被赋值下面8种类型:nil,table,boolean,number,string,funtion,userdate ,thread
> print(a) nil > a = print > type(a) function
支持多个变量同时赋值
> x, y = 3, 5 > print(x * y) 15
非的逻辑运算符是~而非!
^ 运算符为幂运算而非异或运算
逻辑运算
短路求值,不同之处是返回操作数,而非布尔值
> print (true and 10) 10
只能对两个数字或者两个字符串做大小性比较。当对两个不同类型的值做比较时,需要小心。
> print( 0 == "0") false > print( "2" < "15" ) false
在lua中只有nil , false 才被计算为bool false, 其他类型的数据计算为true
多行字符串可以用
a = [[adsd
asdfsdf]]
变量的作用范围
在Lua中可以手动划分代码块, 使用的是do-end语句:
> do >> local i = 10 >> print(i) >> end 10 > print(i) nil
用repeat-until 可以实现do - while的效果
没有 += , -=, ++, — ,*+ 等操作符
参数表中的三个点(...)表示该函数可接受不同数量的实参
> function add( ... ) >> local s = 0 >> for i, v in ipairs{ ... } do >> s = s + v >> end >> return s >> end > print(add(3,1,2,9)) 15
closure 闭合函数,一个闭合函数就是一个函数加上改函数所需访问的多有“非局部变量”
> function newCounter() >> local i = 0 >> return function() >> i = i + 1 >> return i >> end >> end > c1 = newCounter() > print(c1()) 1 > print(c1()) 2 > print(c1()) 3 > c2 = newCounter() > print(c2()) 1
table
table是lua的一个很重要的特性, 可以存储任意数据类型
作用类似于数组,却有很大的差异。并且,lua中起始的index值是从1开始。
遍历方式
for k,v in pairs(t) do body end
能迭代表 t 中的所有键值对。
> name = {"json", "john","zoe", "katy"} > for key, value in pairs(name) do >> print( key, value) >> end 1 json 2 john 3 zoe 4 katy
可以用 pairs来遍历table中全部的值
此外,lua中还有一 ipairs 按照自然索引值遍历,直到索引中断
for i,v in ipairs(t) do body end
将迭代键值对(1,t1) ,(2,t[2]), ... ,直到第一个空值。
> case1 = { >> [1] = 1, >> [2] = 2, >> name = "john", >> age = 31 >> } > for key, value in ipairs(case1) do >> print( key, value ) >> end 1 1 2 2
添加和删除
> t = {10,9,9} > table.insert( t, 1, 2) > for i=1, #t do >> print( t[i] ) >> end 2 10 9 9 >
table.insert (list, [pos,] value)
在 list 的位置 pos 处插入元素 value , 并后移元素 list[pos], list[pos+1], ···, list[#list] 。 pos 的默认值为 #list+1 , 因此调用 table.insert(t,x) 会将 x 插在列表 t 的末尾。
> print( table.insert( t, 100) ) > for i=1, #t do >> print(t[i]) >> end 2 10 9 9 100
table.insert 是没有返回值
table.remove (list [, pos])
移除 list 中 pos 位置上的元素,并返回这个被移除的值。 当 pos 是在 1 到 #list 之间的整数时, 它向前移动元素 list[pos+1], list[pos+2], ···, list[#list] 并删除元素 list[#list]; 索引pos 可以是 #list + 1 ,或在 #list 为 0 时可以是 0 ; 在这些情况下,函数删除元素 list[pos]。
> print( table.remove(t, 2) ) 10 > for key, value in pairs(t) do >> print(key, value) >> end 1 2 2 9 3 9 4 100 >
删除方法中,回返回删除索引对应的值
数组长度 长度操作符“#”, 用于返回一个数组或者线性表的最后一个索引值
5.3中抛弃了table.maxn 因为无论何时,若一个操作需要取表的长度, 这张表必须是一个真序列,或是拥有 __len 元方法 (参见 §3.4.7 )。 所有的函数都忽略传入参数的那张表中的非数字键。
table.sort (list [, comp])
> ss = {} > next(ss) nil > table.sort(t) > for key, value in pairs(t) >> do >> print( key, value ) >> end 1 2 2 9 3 9 4 100 > table.unpack(t) 2 9 9 100 > table.unpack(case1) 1 2