Lua 笔记--语法

简介:

        Lua允许“多重赋值”,也就是一下子将多个值赋予多个变量。每个值或每个变量之间以逗号分隔:

a, b = 10, 2*x

        在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值。

x, y = y, x        -->交换x 与y

        Lua总是会将等号右边值的个数调整到与左边变量的个数相一致。规则是:若值的个数少于变量的个数,那么多余的变量会被赋为nil ;若值的个数更多的话,那么多余的值会被“静悄悄地”丢弃掉。

        多重赋值一般很少使用,但在交换两个变量和用于收集函数的多个返回值时还是很有效的。例如,a, b = f(), 函数f 将返回两个值,a接收了第一个,b接收了第二个。

        “尽可能地使用局部变量”是一种良好的编程风格。局部变量可以避免将一些无用的名称引入全局环境,避免搞乱了全局环境。此外,访问局部变量比访问全局变量更快。最后,一个局部变量通常会随其作用域的结束而消失,这样便使垃圾收集器可以释放其值。

i = 10             -->全局变量
local j = 2        -->局部变量

        在Lua中,有一种习惯写法是:

local foo = foo

        这句代码创建了一个局部变量foo,并将用全部变量foo的值初始化它。如果后续其他函数改变了全局foo的值,那么可以在这里先将它的值保存起来。这种方式还可以加速在当前作用域对foo的访问。

        Lua不支持switch语句,所以一连串的if then elseif else end 代码是很常见的:

if op == "+" then
    r = a + b
elseif op == "-" then
    r = a - b
elseif op == "*"
    r = a * b
elseif op == "/"
    r = a / b
else
    error("invalid operation")
end

        对于while,Lua先测试其条件,如果条件为假,那么循环结束,不然,Lua执行循环体,并重复这一过程:

local i = 1
while a[i] do
    print(a[i])
    i = i + 1
end

        repeat - until 语句重复执行其循环体直到条件为真时结束。测试是在循环体之后做的,因此循环体至少会执行一次。

--打印输入的第一行不为空的内容
repeat
    line  = io.read()
until line ~= ""
print(line)

        与其他大多数语言不同的是,在Lua中,一个声明在循环体中的局部变量的作用域包括了条件测试:

local sqr = x/2
repeat
    sqr = (sqr + x/sqr) / 2
    local error = math.abs(sqr^2 - x)
until error < x/10000            -->在此仍可以访问error

        for 语句有两种形式:数字型for 和泛型for。

        数字型for 的语法如下:

for var=exp1, exp2, exp3 do
    <执行体>
end

        var从exp1 变化到exp2,每次变化都以exp3作为步长递增var,并执行一次“执行体”。第三个表达式exp3 是可选的,若不指定的话,Lua会将步长默认为1.

        需要注意的是:控制变量会被自动地声明为for语句的局部变量,并且仅在循环体内可见。因此,控制变量在循环结束后就不存在了。如果需要在循环结束后访问控制变量的值(通常是在break 循环时),必须将该值保存到另一变量中!

        泛型for 循环通过一个迭代器(iterator)函数来遍历所有值:

--打印数组a 的所有值    --(迭代数组用ipairs)
for i, v in ipairs(a) do
    print(v)
end

        Lua的基础库提供了ipairs,这是一个用于遍历数组的迭代函数。在每次循环中,i 会被赋予一个索引值,同时v 被赋予一个对应于该索引的数组元素值。

--打印table t 中所有的key    --(迭代table用pairs)
for k in pairs(t) do
    print(k)
end

        break 语句用于结束一个循环,它只会跳出包含它的那个内部循环(for、repeat或while),而不会改变外层的循环。在执行了break后,程序会在那个被跳出的循环之后继续执行。

        return 语句用于从一个函数中返回结果,或者用于简单地结束一个函数的执行。任何函数的结尾处都有一个隐式的return。


mytable = {2, 4, k="ok", ctable={}, 6}

--第一种遍历方式
for i=1, #mytable do
	print(mytable[i])
end
--第二种遍历方式,与第一种方式一样都是按照当前的隐式的缩印来迭代并显示值
for i,v in ipairs(mytable) do
	print(i,v)
end
--第三种遍历方式,打印所有,注意table 中索引并不完全是按照书写顺序来的
for k,v in pairs(mytable) do
	print(k,v)
end

--输出:
2
4
6
1	2
2	4
3	6
1	2
2	4
3	6
k	ok
ctable	table: 0x7f84094097f0


s = "ok"
table = {k = 10}        --k 相当于一个索引
table[s] = 12
print(table["k"])        -->10
print(table.k)           -->10
print(table[s])          -->12

a = 'a dshkf \\ * sd'
print(string.format("%q",a)        -->''a dshkf \\ * sd''
--%q 表示输出全部内容

目录
相关文章
|
6月前
|
存储 Java 应用服务中间件
Lua语法讲解
Lua语法讲解
46 0
|
11月前
Lua笔记协程
Lua笔记协程
49 0
|
11月前
Lua笔记表实现class
Lua笔记表实现class
38 0
|
数据采集 存储 JavaScript
Lua 语法 Table 与模块|学习笔记
快速学习 Lua 语法 Table 与模块
156 0
Lua 语法 Table 与模块|学习笔记
|
数据采集 大数据 开发者
Lua 语法函数|学习笔记
快速学习 Lua 语法函数
71 0
Lua 语法函数|学习笔记
|
数据采集 大数据 开发者
Lua 语法数值 for 循环与泛型 for 循环|学习笔记
快速学习 Lua 语法数值 for 循环与泛型 for 循环
67 0
|
数据采集 大数据 开发者
Lua 语法 while 循环与 repeat 循环|学习笔记
快速学习 Lua 语法 while 循环与 repeat 循环
198 0
Lua 语法 while 循环与 repeat 循环|学习笔记
|
数据采集 大数据 开发者
Lua 语法i判断与关系运算符|学习笔记
快速学习 Lua 语法i判断与关系运算符
78 0
|
数据采集 大数据 开发者
Lua 语法逻辑运算符与其他运算符|学习笔记
快速学习 Lua 语法逻辑运算符与其他运算符
69 0
|
数据采集 大数据 开发者
Lua 语法赋值运算符与算数运算符|学习笔记
快速学习 Lua 语法赋值运算符与算数运算符
99 0