Lua中基本的数据类型、表达式与流程控制语句讲解

1. Lua类型
1.1 基本类型

Lua是一种动态类型语言,没有类型定义的语法。Lua一共有8种基础类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)、table(表)。

函数type可根据一个值返回其类型名称(字符串),如print(type(print)),输出“function”;print(type(type(X))) ,输出“string”。(这里不管X有没有定义,type(X)总是返回字符串)

1.2 各类型要注意的地方

关于boolean:

在Lua中,false和nil视为“false”,其它值均视为“true”(包括数字0和空字符串)。
关于number:

该类型用于表示实数(双精度double),整数也用此类型表示。
关于string:

字符串不能像C语言一样直接修改某个字符,必要时应通过string库创建一个新的字符串。字符串可以用一对匹配的单引号或双引号来界定。可以实用类C语言的转义序列。

此外,可以用双方括号[[内容]]来界定,其中的换行字符均被忽略,适用于包含一整段的字符串。若在左边的两个方括号间加入任意数量的等号,如[===[,则字符串右边应该匹配带相同数量等号的方括号,如]===],这样做就可以在不加转义的情况下直接嵌入任意内容的字符串。同理注释也可以这样使用,如--[==[匹配--]==]。

Lua提供运行时的数字与字符串自动转换。如print("10"+1) –> 11,print(10 ..20) –> 1020(“..”是字符串连接符,上例将数字转换成字符串并连接,数字和..之间应该留一个空格)。

建议尽量少用自动转换,如有需要可用强制转换。函数tonumber(x)尝试将x转换成数字,若失败则返回nil,函数tostring(x)将x转换成字符串。在字符串前放置“#”可获得字符串的长度,如print(#"length") –> 6。
关于table:

Table是一种具有特殊索引方式的数组,可以实用除nil外的其他类型的值作为索引,其增长与删减均通过自动内存管理来完成。Table是一个“对象”,程序仅持有一个对它们的引用,例如可以通过a = {}创建一个table并将它的引用存储到a,若再b = a,则b与a引用同一个table。若table的某个元素没有初始化,其值即为nil,可以通过赋nil来删除table的某个元素。

有一种等价写法:p["age"]等价于p.age。注意,p.age和p[age]并不等价。

“#”可用于返回一个数组的最后一个索引值(或其大小)。例如print(a[#a])打印列表a的最后一个值,a[#a+1] = io.read()读入一个值并插入到列表a末尾。注意,Lua将nil作为界定数组结尾的标志,当一个数组中间含有nil时,#会认为第一个nil就是结尾,因此应避免对含“空隙”的数组使用#。

在Lua中,一般默认table第一个索引为1而不是C语言中的0。
Function、userdata和thread类型留到以后再讲。
2. 表达式
2.1. 算术操作符

常规的操作符有:+加、-减、*乘、/除、^指数、%取模。其中^可用于任意实数,如x ^ (-1 / 3)计算x的立方根倒数。%可以这样使用:x % 1结果是x的小数部分,x - x % 0.01是x精确到小数点后两位的结果。

2.2. 关系操作符

常规关系操作符有:<小于、>大与、<=小于等于、>=大于等于、==相等、~=不等。==和~=可用于任意两个值,若两个值具有不同类型则不相等,有相同类型则作正常比较(nil只与其自身相等)。对于对象则比较它们的引用。

2.3. 逻辑操作符

逻辑操作符有and、or和not。对and(or)来说,若第一个操作数为假(真),就返回第一个操作数,否则返回第二个操作数。如print(4 and 5) –> 5,print(false or 5) –> 5。

有一些常用写法:x = x or v,可用在没有设置x的时候,将其设为一个默认值v。另一种写法(a and b) or c类似a ? b : c,如max = (x > y) and x or y。

2.4. 字符串连接符

可用“..”(两个点)来连接两个字符串,若其中任一个为数字,Lua会自动转换,如print(0 ..1) –> 01。连接字符串只会创建一个新字符串,不会对原操作数进行修改。

Lua运算符优先级顺序如下图所示。

2.5. Table构造式

除了上述直接赋予{}创建空table以外,可以初始化其值,如day = {"S", "M", "T"},或者point = {x = 10, y = 20}(即point.x=10,point.y=20)。以上两种初始化方式可以混用,还可以用分号代替逗号,来将列表部分和记录部分明显地分隔开,如polyline = {color = "blue"; {x = 0, y = 0}, {x = 10, y = 10}, {x = 20, y = 30}},则print(polyline[2].x)` –> 10。

更加通用的初始化格式,可以在方括号间声明索引值,如opnames={["+"] = "add", ["-"] = "minus"}。若某些情况真的需要以0作为一个数组的起始索引,可以这样days={[0] = "S", "M", "T"}。但是不推荐在Lua中以0作为索引起始值,因为大多数内建函数都假设数组起始于索引1。

3. 顺序结构
3.1. 赋值

除了普通的用“=”赋值之外,Lua还允许多重赋值,每个值和每个变量之间用逗号分隔。Lua总会将等号右边值的个数调整到与左边变量个数一致,若值个数少了,则多余的变量将赋予nil;若值个数多了,则多余的值会被丢弃。如a, b = 10, 2 * x,x, y = y, x(交换)。多重赋值一般用于交换两个变量的值,或者接受一个函数的多个返回值。

3.2. 局部变量与程序块

相对于全局变量,Lua还提供了局部变量,给变量加上限定词local即可。局部变量的作用域仅限于声明它们的那个程序块(如控制结构的执行体、函数等)。

注意,在交互模式中每行输入内容自身就形成了一个程序块,因此单句local声明没有效果。可以显式界定一个块,将内容放入一对do-end关键字中即可,这个方法也可以用于严格控制某些局部变量的作用域。

有一种习惯写法local foo = foo,创建一个局部变量foo并用全局变量foo的值初始化它。若后续其他函数改变全局变量foo的值,可以在这里先将其保存起来。

4. 控制结构
所有控制结构语句都有一个显示的终止符:if、for、和while以end结尾,repeat以until结尾。

4.1. if then else(elseif)语句

格式:if <条件1> then <内容1> elseif <条件2> then <内容2> else <内容3> end
Lua中不支持switch语句,所以一连串if elseif语句是很常见的。

4.2. while和repeat语句

格式:while <条件> do <循环体> end

格式:repeat <循环体> until <条件>
在Lua中,一个声明在循环体内的局部变量的作用域包括循环的条件测试。

4.3. 数字型for语句

格式:for var=exp1, exp2, exp3 do <循环体> end
上式表示var从exp1变化到exp2,以exp3作为步长递增var。其中exp3是可选的,若不指定则默认步长为1。如果将exp2设为math.huge,则为无限循环。

有一些细节需要注意。for的3个表达式是在循环开始前一次性求值的,以后将不再求值。另外,控制变量会被自动地声明为for语句的局部变量,仅在循环体内可见。

4.4. 泛型for语句

泛型for循环通过一个迭代器来遍历所有值,如for i,v in ipairs(tableA) do print(v) end,其中i被赋予索引值,而v被赋予对应的元素值。其中ipairs(array)函数用于遍历数组并返回数字下标-元素值对,pairs(table)函数用于遍历table并返回键-值对,string.gmatch(string)迭代字符串中的单词。

泛型for的一个应用是创建逆向table,即新table的键值与原table键值反转。

4.5. break和return语句

这两个语句都用于跳出当前的语句块,break结束一层循环,return结束一个函数的执行。如果刚定义了一个function然后直接要在一开始就跳出函数作为调试用,可以用一个显示的do块来包含return语句,即function foo() do return end end。

(0)

相关推荐

  • Lua学习笔记之数据类型

    从本篇博客开始研究一下Lua,现在的Lua真得是很火,因为Cocos2d-x写游戏的时候会用到,所以就拿过来学学吧,先从基础的语法开始,然后慢慢的深入.本人也是刚刚学习,希望和学习Lua的大家交流,博客权当笔记,有错误之处还请赐教. 当然首先是开发环境了,我的学习背景是Cocos2d-x,所以下载了最近发布的Cocos Code IDE版本,我们可以在Cocos Code IDE上边新建工程,然后写Lua测试代码,关于Cocos Code IDE的使用官方有不少的教程,这里就不说了.当然你也可以

  • Lua中的操作符和表达式总结

    前言 这里总结的内容和其它语言的基本类似,所以这里就只是基本的进行总结.不做详细的讲解. 算术操作符 Lua支持常规的算术操作符有:"+"(加法),"-"(减法),"*"(乘法),"/"(除法),"^"(指数),"%"(取模),一元的"-"(负号).所有的这些操作符都用于实数.例如:x^0.5将计算x的平方根,x^3将计算x的3次方. 关系操作符 Lua提供的关系操作

  • Lua数据类型介绍

    Lua 是一个功能强大.快速.轻量的可嵌入式脚本语言,由标准的 ANSI C 实现,由于拥有一组精简的强大特性,以及容易使用的 C API,这使得它可以很容易嵌入或扩展到其他语言中使用,并且有个非官方认领的中文名 -- "撸啊". 安装 Lua Lua 安装很简单,把源码下载下来后,直接 make 就行: 复制代码 代码如下: wget http://www.lua.org/ftp/lua-5.2.2.tar.gz tar -zxvf lua-5.2.2.tar.gz cd lua-5

  • Lua学习笔记之运算符和表达式

    本篇博客学习一下Lua的运算符,比较简单,我将说明直接写到了代码中,代码如下. --算术运算符 --二元运算符:+ - * / ^ (加减乘除幂) --一元运算符:- (负值) --这些运算符的操作数都是实数,Lua中没有自增自减的运算符. --关系运算符 -- < > <= >= == ~= --这里需要注意的是不等于是用~=表示的 --这些操作符返回结果为false或者true:==和~=比较两个值,如果两个值类型不同,Lua认为两者不同: --nil只和自己相等.Lua通过引

  • Lua学习笔记之表达式

    前言 这里总结的内容和其它语言的基本类似,所以这里就只是基本的进行总结.不做详细的讲解. 算术操作符 Lua支持常规的算术操作符有:"+"(加法),"-"(减法),"*"(乘法),"/"(除法),"^"(指数),"%"(取模),一元的"-"(负号).所有的这些操作符都用于实数.例如:x^0.5将计算x的平方根,x^3将计算x的3次方. 关系操作符 Lua提供的关系操作

  • Lua中的基本数据类型详细介绍

    基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8中基本类型,分别是: 1.nil(空)类型 2.boolean(布尔)类型 3.number(数字)类型 4.string(字符串)类型 5.userdata(自定义类型) 6.function(函数)类型 7.thread(线程)类型 8.table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: 复

  • 深入探究Lua中的解析表达式

     使用一个模式 这个例子显示了一个建立和使用模式的程序,它非常简单但很完整: 复制代码 代码如下: local lpeg = require "lpeg" -- matches a word followed by end-of-string p = lpeg.R"az"^1 * -1 print(p:match("hello"))        --> 6 print(lpeg.match(p, "hello")) 

  • 实现Lua中数据类型的源码分享

    概述 在Lua中有8种基础类型:nil.boolean.number.string.userdata.function.thread和table.可以使用函数type查看某个变量或值的类型,返回相应的类型名称.像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息.下面将通过Lua 5.2.1的源码来看类型的实现.    源码实现 Lua将值表示成带标志的联合结构,代码如下(lobject.h): 90 /* 91 ** Union of all Lua values 9

  • 详解Lua中的数据类型

    Lua是动态类型语言,所以变量没有类型,仅值有类型.值可以被存储在变量中,作为参数传递,并作为结果返回. 在Lua中虽然我们没有变量的数据类型,但我们有类型的值.用于数值数据类型的列表在下面给出.  函数类型 在Lua中有一个叫做函数类型,使我们能够知道变量的类型.如下一些例子给出了下面的代码. 复制代码 代码如下: print(type("What is my type"))   --> string t=10 print(type(5.8*t))              

  • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记

    赋值语句 注释,单行用(--)来表示:多行用(--[[ ... ]])来标示: 定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的. 赋值,是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量.a, b = 10, 2*x <--> a=10; b=2*x 遇到赋值语句Lua会先计算右边所有的

  • Lua表达式和控制结构学习笔记

    算术操作符 Lua 的算术操作符有: "+"(加法): 复制代码 代码如下: print(1 + 2) "-"(减法): 复制代码 代码如下: print(2 - 1) "*"(乘法): 复制代码 代码如下: print(1 * 2) "/"(除法): 复制代码 代码如下: print(1 / 2) "^"(指数): 复制代码 代码如下: print(27^(-1/3)) "%"(取模)

  • Lua教程(三):表达式和语句

    一.表达式: 1. 算术操作符:     Lua支持常规算术操作符有:二元的"+"."-"."*"."/"."^"(指数)."%"(取模),一元的"-"(负号).所有这些操作符都可用于实数.然而需要特别说明的是取模操作符(%),Lua中对该操作符的定义为:   复制代码 代码如下: a % b == a - floor(a / b) * b 由此可以推演出x % 1的

  • Lua判断数据类型的方法

    一.判断数据类型的方法 type(xxxx) 这个函数的返回值是string类型   也就是说: 复制代码 代码如下: a = type(X)   -- a="nil" b = type(a)   -- b="string" a = type(nil) -- a="nil" 二.Lua脚本语言的8种基本数据类型 1.数值(number):内部以double表示. 2.字符串(string):总是以零结尾,但可以包含任意字符(包括零),因此并不等价

随机推荐