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

注:参考文章
笔记: LUA基础: INTERPRETER,特殊的程序语法

相关推荐