在Lua中,表达式包括:数值常量、字符串字面值、变量、单目和双目运算符,函数调用,也包括一些非传统的函数定义和表结构。
1.算术运算符
Lua支持常规的算术运算符:'+', '-', '*', '/', '^', '%', '-'(负)。所有这些运算符都对实数起作用。举个例子,x^0.5, 计算x的平方根, x^(-1/3),计算x的立方根的反数。
在Lua中,'%'运算符定义规则如下:
a%b == a - floor(a/b)*b
对整型参数来说,它表示常规的意义,结果跟第二个参数b符号相同。
对实数来说,它有一些额外的用途。例如,x%1 表示x的小数部分,x-x%1 表示x的整数部分。类似的,x-x%0.01 将x精确到小数点后2位。
2.关系操作符
Lua提供了如下关系操作符:
< > <= >= == ~=
所有这些操作符产生的结果都是true或者false
'=='检查是否相等,'~='检查是否不等。这两个操作符可以作用于任意的两个值。如果要比较的两个值是不同的类型,那么Lua认为它们是不等的。否则,Lua根据它们的类型来比较它们是否相等。特例,nil只等于它本身。
Lua根据引用来比较table, userdata, function,也就是说,只有二者是同一个对象的时候,它们才相等。例如:
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
执行下上面的代码,你可以得到, a == c, 但是 a ~= b
我们把<, >, <=, >=称为order operator。
order operator只能应用于数值和字符串。Lua根据字母表顺序来比较字符串的大小,字母表的顺序由本地设置决定。非数值和字符串的值只能比较相等或者不相等,不能用于order operator。
当比较两个不同类型的值时,一定要小心:记住"0"和0是不同的。除此以外,2<15显然是true的,但是"2"<"15"是false的(根据字母表顺序比较)。为了避免不一致的结果,当你将string和number混合使用到order operator时,例如 2<"15",Lua会产生一个runtime error。
3.逻辑运算符
逻辑运算符有:and, or, not。跟控制结构(if,while等)类似,所有的逻辑操作符把false和nil认为是false,其他的任意值都为true。
and:如果第一个参数为false,返回第一个参数,否则返回第二个参数。
or :如果第一个参数为false,返回第二个参数,否则返回第一个参数。
print(4 and 5) ----> 5
print(nil and 13) ----> nil
print(false and 13) ----> false
print(4 or 5) ----> 4
print(false or 5) ----> 5
'and'和'or'都是用short-cut计算方式,也即是说,只有在有需要的时候,才会去计算第二个参数的值。这样保证了类似(type(v)=="table" and v.tag=="h1")这样的表达式不会产生run-time error。(当v不是table类型时,Lua不会去计算v.tag的值)。
有用的Lua表达式:x = x or v,等价于:
if not x then x = v end
(加上x没有被赋值为false),如果x没有被设置,那么给它个默认值v。
另一个有用的Lua表达式:a and b or c,等价于C表达式 a ? b : c,(假设b不为false)。例如,我们可以用下面的语句来得到x和y的最大值。
max = (x >y) and x or y
当 x>y,第一个and表达式结果为第二个参数x,x总是true(因为x为一个数值),那么or表达式的结果为x or y,结果为x。
当 x<y,第一个and表达式的结果为false,那么or表达式的值就为false or y,结果为y。
'not'操作符总是返回true或者false
print(not nil) --> true
print(not false) --> true
print(not 0) --> false
print(not not nil) --> false
4.连接操作符
Lua用'..'(两个点)来表示string连接符。如果它的任一个操作数为数字,Lua会把它转为string。
print("Hello " .. "World") --> Hello World
print(0 .. 1) --> 01
不要忘了,Lua中的string是常量。string连接操作符会创建一个新的string,不会对它的操作数有任何修改:
a = "Hello"
print(a .. " World") --> Hello World
print(a) --> Hello
5.优先级
Lua中的操作符优先级,如下表所示,从高到低
^
not # -(单目)
* / %
+ -
..
< > <= >= ~= ==
and
or
除了'^和'..',所有的双目操作符都是左关联的。因此,下表中,左面的表达式和右面的表达式是等价的:
a+i < b/2+1 <--> (a+i) < ((b/2)+1)
5+x^2*8 <--> 5+((x^2)*8)
a<y and y<=z <--> (a<y) and (y<=z)
-x^2 <--> -(x^2)
x^y^z <--> x^(y^z)
在有疑问的时候,就用括号'()',这比查手册更方便和简单,而且,当你以后看代码的时候,你可能仍然有同样的疑问,显式地使用括号'()'会更直观一点。
6.表构造函数
构造函数是一个用来初始化表(table)的表达式。它是Lua的一个独特特性和很强大的功能之一。
最简单的构造函数是空构造函数,{},创建一个空table。构造函数也可以初始化数组,例如:
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
将day[1]初始化为"Sunday", day[2]为"Monday",注意,index是从1开始。
print(day[4]) --> Wednesday
Lua提供一个专门的语法去初始化record-like table,如下:
a = {x=10, y=20}
等价于
a = {}, a.x = 10; a.y = 20
不管我们用什么构造函数去创建一个table,我们都可以增加或减少结果中的field:
w = {x=0, y=0, label="console"}
x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "another filed" -- add key 1 to table 'w'
x.f = w -- add key 'f' to table 'x'
print(w["x"]) --> 0
print(w[1]) --> another field
print(x.f[1]) --> another field
w.x = nil -- remove field 'x'
也就是说,table创建过程是相同的。构造函数只是将其初始化而已。
Lua每次使用构造函数,都会创建并初始化一个新的table。因此,我们可以用table来实现一个list:
list = nil
for line in io.lines() do
list = {next=list, value=line}
end
这些代码从stdin读入行,然后存入一个list中,顺序跟读入的顺序相反。list中的每个node有两个field:value,包含行的内容,next,指向下一个node。下面的代码遍历这个list,并且打印它的内容:
local l = list
while l do
print(l.value)
l = l.next
end
以上两段代码的示例:
(由于我们在栈上实现了list,打印的时候会是逆序的)。尽管实现很方便,但是我们在Lua程序中很少使用如上实现的list;List可以作为array得到更好的实现,我们会在后面再讲这个问题。
我们可在一个构造函数中同时使用record-style和list_style的初始化方式:
polyline = {color="blue", thickness=2, npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
上面的例子也说明了如何使用嵌套的构造函数来表示更复杂的数据结构。每一个polyline[i]都是一个table,表示一条记录(record):
print(polyline[2].x) --> -10 --此处要注意index 1是从哪里开始的,下面的示例may be helpful
print(polyline[4].y) --> 1
这两种形式的构造函数(record-style和list_style)都有一些局限性。一些负数或者string不能作为标识符。
因此,Lua提供了一种更通用的格式。在这个格式中,我们显式的写出每一个[index]。
opnames = {["+"] = "add", ["-"] = "sub",
["*"] = "mul", ["/"] = "div"}
i = 20; s = "-"
a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s}
print(opnames[s]) --> sub
print(a[22]) --> ---
这个规则有点麻烦,但是更方便灵活:record-style和list_style是这个通用格式的两个特例而已。
{x=0, y=0} <==> {["x"]=0, ["y"]=0}
{"r", "g", "b"} <==> {[1]="r", [2]="g", [3]="b"}
有时候,你想要你的array的index从0开始(Lua默认从1开始),用下面的方式就可以了:
days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
现在,第一个值"Sunday", index为0 。它不会影响其他的field;"Monday"的index为1,因为它是构造函数中的第一个list值;其他的跟随。尽管实现很便利,但是不推荐这样用。Lua的很多内置函数都假设array的index从1开始,如果一个array从0开始,可能会在处理上有问题。
在最后一个元素后面,可以加逗号','。这个末尾的逗号','是可选的,但都是合法的:
a = {[1]="red", [2]="green", [3]="blue",}
通过这个便利性,程序在生成Lua table的时候不需要对最后一个元素做特殊处理。
最后,我们可以使用分号';'来代替逗号',',你可以在用';'来分割table中的不同属性的部分,例如:
{x=10, y=45; "one", "two", "three"}
水平有限,如果有朋友发现错误,欢迎留言交流。
分享到:
相关推荐
这个"lua基础学习文档"涵盖了对初学者至关重要的几个主题:lua函数库、模式匹配、文件处理以及表和元方法。让我们逐一深入探讨这些核心概念。 1. Lua函数库: Lua标准库提供了一系列内置函数,方便用户进行各种常见...
### 深入探究Lua中的解析表达式 #### Lua与解析表达式的背景 Lua是一种轻量级、高效的脚本语言,常被用于嵌入到应用程序中以提供灵活的配置选项和扩展功能。Lua的一个强大之处在于它的模式匹配能力,这得益于`lpeg...
【教程】:从零开始做游戏 - Lua语言基础 Lua是一种轻量级的脚本语言,广泛应用于游戏开发,特别是Egame平台的游戏制作。作为初学者,了解并掌握Lua语言的基础是构建游戏逻辑的关键步骤。以下是一份详尽的Lua语言...
### Lua基础应用知识点详解 #### 一、Lua简介与特性 **Lua** 是一种轻量级的脚本语言,以其高效、简洁著称。它由标准C语言编写,并且源代码完全开放。Lua的设计初衷是为了方便地嵌入到各种应用程序中,以便为这些...
### Lua基础教程(三)基本语法 #### 交互模式编程 Lua支持一种称为**交互模式**的功能,允许用户逐行输入指令并立即查看执行结果。要启动交互模式,可以通过命令行使用`lua -i`或者仅使用`lua`命令。 ##### 启动...
### Lua基础教程(八)条件语句 #### 条件语句概述 在Lua编程语言中,条件语句是控制程序流程的一种基本机制。通过条件语句,可以根据不同的条件执行不同的代码块,从而实现程序逻辑的多样性。条件语句允许程序员...
### Lua基础教程(四)变量详解 #### 一、变量概念 在Lua编程语言中,变量是用来指代程序中可以操作的存储区域的一种命名方式。一个变量可以存储不同类型的值,例如数字、字符串、布尔值、函数乃至表格等。变量名...
这部分涵盖了Lua的词法约定、变量、语句、表达式和函数定义等基本概念。 8. 编程接口 包括栈操作、C闭包、注册表等底层功能。 9. 辅助库 提供了如数学、字符串处理、表操作等功能。 10. 标准库 标准库是Lua提供的...
在Lua中,表达式和控制结构是编程的基础元素,它们使得程序能够进行计算、决策和循环等操作。 首先,我们来看算术操作符。Lua提供了基本的算术运算,包括加法"+"、减法"-"、乘法"*"、除法"/"、指数"^"和取模"%"。...
这个"Lua学习框架代码"提供了一个基础的学习平台,帮助初学者更好地理解和掌握Lua编程。下面将详细介绍Lua的一些核心概念和特性,以及如何通过这个框架进行学习。 1. Lua的基础语法: - 变量:Lua中的变量没有类型...
5. **表达式**:Lua的表达式涵盖了算术、关系、逻辑运算以及串联。优先级和括号用于控制运算顺序。表构造器允许创建动态表格,函数调用是第一类值,这意味着它们可以作为参数传递,也可以作为返回值。 6. **元表和...
### Lua API及Lua文档知识点概览 #### 一、引言 Lua是一种轻量级、高效且可嵌入的脚本语言,广泛应用于...以上内容覆盖了Lua语言的基础概念、高级特性以及标准库的使用方法,对于学习和使用Lua都是非常宝贵的知识点。
Lua是一种轻量级的脚本语言,它在设计上支持通用的过程...以上内容便是根据提供的文件信息整理的Lua语言的基础知识点,其涉及了Lua的设计理念、语言特性和基本语法。希望这些信息对于学习和使用Lua语言的用户有所帮助。
在学习Lua游戏开发的过程中,首先需要理解Lua的基础语法。Lua是一种动态类型的脚本语言,其语法简洁明了,易于理解和编写。变量声明无需指定类型,而是根据赋值自动推断。此外,Lua支持表(table)作为其核心数据...
1. **基础语法**:LUA的变量是全局的,但可以通过local关键字声明为局部。它支持基本数据类型如数字、字符串、布尔值、表(相当于数组和哈希表的结合)、函数和nil。学习LUA的控制结构,如条件语句(if-then-else)...
首先,了解Lua中的正则表达式基础。在Lua 5.1及以后的版本中,正则表达式功能是通过`string.gmatch`和`string.gsub`函数实现的。`string.gmatch`用于迭代字符串中所有匹配的模式,而`string.gsub`则用于替换匹配到的...
- **简述**:解释了Lua中的表达式概念,包括算术表达式、逻辑表达式等。 - **知识点**: - 不同类型的表达式及其运算规则。 - 运算符优先级及结合性。 **第4章 基本语法** - **简述**:覆盖了Lua的基本语法规则,...
- **协程**:Lua的协程提供了一种控制线程执行的方式,可以用来实现协同程序的协作性切换,是实现非抢占式多任务的基础。 2. **语言** - **词法约定**:包括标识符、关键字、字面量、运算符等基本语法元素的定义...
### Lua基础教程(六)运算符 #### 一、引言 在编程语言Lua中,运算符扮演着至关重要的角色,它们允许开发者执行各种数学和逻辑操作。本篇教程将详细介绍Lua中的各种运算符,包括算术运算符、关系运算符、逻辑...
10. **社区和扩展**:Lua拥有活跃的社区,提供了众多第三方库和扩展,增强了Lua的功能,例如LPEG(Lua的正则表达式库)和Corona SDK(用于移动应用开发)。 通过阅读这份"Lua中文参考",你可以系统地学习Lua的所有...