文档章节

Lua 笔记--语法

_子墨
 _子墨
发布于 2014/12/27 15:12
字数 1276
阅读 55
收藏 1

        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 表示输出全部内容


© 著作权归作者所有

上一篇: Lua 函数--函数
下一篇: Lua 笔记--表达式
_子墨
粉丝 48
博文 157
码字总数 141425
作品 0
深圳
iOS工程师
私信 提问
Lua学习笔记

注: 标题中带“Cocos”的为Lua结合Cocos的文章。 【基础模块】 Lua(1) ——Cocos之Code IDE入门指南 Lua(2) ——基础语法 Lua(3) ——Cocos之语法糖class Lua(4) ——基本库函数 Lua(5) ——...

shahdza
2015/10/08
0
0
编译原理之学习 lua 1.1 笔记 (三) 表对象 array 及其相关指令

本节研究 lua 1.1 中的表对象, lua 内部称为 array, 底层实现为 hash, 类似于 php 中的 array(), js 中的 {} 对象等. 先列出待研究的问题: 1. lua 对象的一般语法和使用, 示例. 2. 内部的底层...

刘军兴
2013/12/23
187
0
【精选】Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)

源码地址:https://github.com/Tinywan/Lua-Nginx-Redis Nginx与Lua编写脚本的基本构建块是指令。 指令用于指定何时运行用户Lua代码以及如何使用结果。 下面是显示指令执行顺序的图。 当一个...

tinywan1227
2017/03/09
0
0
【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一、介绍   各种 bylua, byluablock和* byluafile配置指令用作nginx.conf文件中Lua API的网关。 下面描述的Nginx Lua API只能在这...

tinywan1227
2017/03/12
0
0
Lua脚本学习笔记

Lua脚本优点 1、 减少网络开销;多次请求在脚本中,一次即可完成 2、 原子操作 3、 复用 4、 可实现热切换 Lua测试 $ redis-cli --eval /qpth/test.lua rate.limiting:127.0.0.1 , 10 3 详解...

独特55
2016/03/07
83
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
45分钟前
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
47分钟前
5
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部