不需要 “ ;”分隔符
> 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。