lua
- 格式:doc
- 大小:737.32 KB
- 文档页数:85
Lua简介(官⽅社区:)是⼀门开源、简明、可扩展且⾼效的弱类型解释型脚本语⾔。
由于其实现遵循C标准,它⼏乎能在所有的平台(windows、linux、OS X、Android、iOS、PlayStation、XBox、wii等)上运⾏。
当前最新的lua版本为5.3.5;前两位版本号为lua的⼤版本,相同的⼤版本之间是兼容的;即5.3.5向下兼容5.3.4~0等版本版本信息定义在lua.h中,即宏LUA_RELEASE#define LUA_VERSION_MAJOR "5"#define LUA_VERSION_MINOR "3"#define LUA_VERSION_NUM 503#define LUA_VERSION_RELEASE "4"#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2017 , PUC-Rio"#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"lua⾮常⼩巧精简,其解释器加上周边的库函数也不过1w多⾏代码。
以下是Lua5.3.5的源⽂件:核⼼⽂件:⽂件名作⽤对外接⼝前缀lapi.c c语⾔接⼝lua_lcode.c源码⽣成器luaK_ldebug.c调试库luaG_ldo.c函数调⽤及栈管理luaD_ldump.c序列化预编译的lua字节码lfunc.c提供操作函数原型及闭包的辅助函数luaF_lgc.c GC luaC_llex.c词法分析luaX_lmem.c内存管理luaM_lobject.c对象管理luaO_lopcodes.c字节码操作luaP_lparser.c语法分析luaY_lstate.c全局状态机luaE_lstring.c字符串操作luaS_ltable.c表操作luaH_ltm.c tag⽅法luaT_lundump.c加载预编译字节码luaU_lvm.c虚拟机luaV_lzio.c缓存流接⼝luaZ_内嵌库⽂件:⽂件名作⽤lauxlib.c库编写时需要⽤到的辅助函数库lbaselib.c基础库lbitlib.c bit位操作库lcorolib.c协程库lctype.c封装c标准库中的ctype⽂件ldblib.c调试库linit.c负责内嵌库的初始化liolib.c IO库lmathlib.c数学库loadlib.c动态扩展库加载器loslib.c OS库lstrlib.c字符串操作库ltablib.c表操作库lutf8lib.c utf8库解释器、编译器⽂件:⽂件名作⽤lua.c解释器luac.c编译器lua很容易编译成静态库、动态库或以源代码的形式集成到应⽤程序中,并⽅便地与c/c++及其他语⾔进⾏互操作,因此其被称为胶⽔语⾔(glue language)。
lua 原理Lua是一种轻量级的脚本语言,主要用于嵌入应用程序中。
它的设计目标是提供简洁、高效、可扩展的编程环境。
下面将介绍Lua的主要特点和工作原理。
1. 脚本语言:Lua是一种脚本语言,不需要编译成机器代码,可以直接在解释器中运行。
这使得Lua具有灵活性和可移植性,可以在不同平台和操作系统上运行。
2. 轻量级:Lua的解释器非常小巧,只有几十KB,因此它的启动速度非常快。
这使得Lua非常适合嵌入应用程序中,不会增加太多的内存占用和启动时间。
3. 扩展性:Lua提供了丰富的API和扩展机制,可以通过编写C代码来扩展Lua的功能。
这使得Lua可以与其他语言进行交互,并调用底层的系统功能。
4. 垃圾回收:Lua使用自动垃圾回收机制来管理内存,这样程序员就不需要手动分配和释放内存。
垃圾回收的机制可以有效地回收不再使用的内存,提高程序的性能。
5. 可嵌入性:Lua可以嵌入到其他应用程序中使用。
它提供了一个简单的API,可以与其他语言进行交互,如C、C++和Java等。
这使得Lua可以用于编写插件、脚本和扩展模块。
6. 强大的语言特性:Lua提供了一些强大的语言特性,如闭包、元表和协程等。
闭包使得函数可以访问外部函数中的变量,元表可以用于实现面向对象编程,协程可以用于实现基于事件的异步编程。
Lua的工作原理是通过解释器来执行Lua脚本。
解释器首先会将Lua脚本解析成一系列的字节码指令,然后逐条执行这些指令。
解释器会根据指令的类型和操作数来执行相应的操作,如变量赋值、函数调用和控制流语句等。
Lua的解释器是一个虚拟机,它模拟了计算机的执行环境,包括内存、栈、寄存器和指令等。
解释器会在虚拟机中分配内存来保存变量的值和函数的执行栈。
每次执行指令时,解释器会读取指令和操作数,并根据指令的类型执行相应的操作。
解释器还会根据程序的控制流改变指令的执行顺序,如条件判断、循环和函数调用等。
总的来说,Lua是一种轻量级的脚本语言,具有简洁、高效和可扩展的特点。
lua的基本数据类型
Lua的基本数据类型可以分为9种,包括布尔类型、数值类型、字符串类型、函数类型、线程类型、表类型、自定义类型、空值类型以及轻量级用户数据类型。
1.布尔类型:在Lua中,布尔类型有两种值:true和false。
2.数值类型:数值类型可以保存实数,包括整数和浮点数,整数可以是十进制和十六进制,由一串数字序列组成。
如果是0x开始,则表示是一个十六进制数。
3.字符串类型:字符串是若干封装在双括号(“)或单括号(‘)内的字符。
4.函数类型:在Lua中,函数可以作为一种数据类型使用,函数可以赋值给一个变量,函数可以作为参数传递给其他函数。
5.线程类型:表示一个线程,线程可以同时执行多个,每个线程拥有自己独立的栈、局部变量和指令指针。
6.表类型:表是Lua中的主要数据结构,是一种关联数组,可以存储多个值,并且每个值都可以通过索引访问。
7.自定义类型:用户可以创建自己的类型,这使得Lua非常灵活和强大。
8.空值类型:在Lua中,可以使用nil来表示空值。
9.轻量级用户数据类型:这是Lua中的一种特殊数据类型,它允许用户将任意数据与特定的类型关联起来。
lua new方法Lua是一种轻量级的脚本语言,被广泛用于游戏开发、嵌入式系统和大规模分布式应用等领域。
在Lua中,对象的创建通常使用new方法来完成。
本文将详细介绍Lua中的new方法及其使用。
一、什么是new方法在面向对象编程中,new方法是用于创建对象的一个特殊方法。
它通常会在对象的类中定义,并通过调用该方法来实例化一个对象。
在Lua中,并没有一个固定的语法规则来定义和使用new方法,而是根据开发者的习惯和需求进行灵活的实现。
二、Lua中的new方法实现示例在Lua中,可以通过定义一个普通的函数来实现new方法。
下面是一个示例:```-- 定义一个类local MyClass = {}MyClass.__index = MyClass -- 将类自身设置为其元表,以便于后续的对象实例化-- 创建一个new方法function MyClass.new(name, age)local self = setmetatable({}, MyClass) -- 创建一个空表,并将其元表设置为类本身 = nameself.age = agereturn selfend-- 使用new方法创建对象local obj = MyClass.new("张三", 18)print() -- 输出:张三print(obj.age) -- 输出:18```在上面的示例中,我们首先定义了一个名为MyClass的类,并为其设置了一个元表(可通过__index字段实现)。
然后,我们通过定义一个名为new的方法来创建对象。
在new方法中,我们首先使用setmetatable函数来创建一个空表,并将其元表设置为类本身,然后再通过设置类的属性来初始化对象。
最后,我们返回该对象以供使用者进行后续操作。
三、new方法的灵活性在实际开发中,我们可以根据具体需求对new方法进行进一步的扩展和定制。
例如,可以在new方法中添加一些参数校验的逻辑,或者对对象的属性进行一些默认赋值操作。
lua函数调用Lua函数调用是Lua编程语言中非常常见和重要的一个概念。
Lua 是一种轻量级的脚本语言,被广泛应用于游戏开发、嵌入式系统、网络应用等领域。
在Lua中,函数是一种可重复使用的代码片段,通过函数调用可以实现代码的模块化和复用。
本文将介绍Lua函数调用的基本语法和使用方法,并通过几个实例来演示其具体应用。
一、Lua函数调用的基本语法Lua函数调用的基本语法非常简单,形式如下:function_name(argument1, argument2, ...)其中,function_name是函数的名称,argument1、argument2等是函数的参数。
通过在函数名后面加上括号,并在括号内传入参数,就可以调用该函数。
Lua中的函数参数可以是任意类型的数据,包括数值、字符串、表等。
二、Lua函数调用的示例1. 示例一:计算两个数的和下面是一个简单的示例,演示了如何定义一个函数并调用它来计算两个数的和:function add(x, y)return x + yendlocal result = add(3, 5)print(result)在这个示例中,我们定义了一个名为add的函数,它接受两个参数x和y,并返回它们的和。
然后,我们通过调用add函数并传入参数3和5,将函数的返回值赋给result变量,并打印出来。
执行这段代码,将会输出8。
2. 示例二:字符串连接下面的示例演示了如何定义一个函数来连接两个字符串:function concat(str1, str2)return str1 .. str2endlocal result = concat("Hello, ", "Lua!")print(result)在这个示例中,我们定义了一个名为concat的函数,它接受两个字符串参数str1和str2,并通过使用字符串连接运算符..将它们连接起来。
然后,我们通过调用concat函数并传入参数"Hello, "和"Lua!",将函数的返回值赋给result变量,并打印出来。
Lua是动态弱类型语言,变量不要类型定义也可以使用。
Lua脚本语言是大小写敏感的注释:--变量--局部变量和全局变量--局部变量要有local关键字标识,全局变量没有局部变量的优势--变量的类型表示空除了nil和false是false外,其余的全是true,零也是ture--NUMBER表示数字,支持很多的number--STRING ,还支持转义字还可以用中括号表示a和b是等效的Lua数据类型中有一个表类型,表类型类似数组或者容器,它可以存储多个对象,表类型实现了一个关联数组。
表可以以不同类型的值构成,它可以包含所有的类型的值。
还可以两种方式等效的还可以混着用还可以嵌套用如果没有那就创建属性操作符And的结果不是bool类型,语句For的第二种形式--多重赋值Lua支持多重赋值。
多重赋值是多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,然后按照次序将赋值语句右边的值赋值给左边的变量函数定义在lua中,使用关键字funcation来定义一个函数,在编码过程中,函数可以被当作变量一样使用。
可以返回多个变量,并且以end为结束标志Lua语言中函数可以接受可变数目的参数。
在声明函数的参数列表中,开发者使用三点(...)表示可变的参数。
Lua会将函数的参数放在一个叫arg的表中。
此表除了包含了参数对象外,还有一个域n的数值表示参数的个数。
Lua会将前面的实参传给函数的固定参数,后面的实参放在arg表中。
Arg作为一个表类型存在,其中存储着可变参数对象。
它的技术将从1开始,n代表了表的长度也就是参数的个数。
Lua函数返回值(1)当函数调用作为赋值表达式最后一个函数或者仅有的一个参数时,lua语言将会根据变量个数函数尽可能多的返回多个值,不足补nil,超出舍去。
其它情况,函数调用仅返回第一个值。
可以用type()函数来检查变量类型。
lua基本语法Lua是一种轻量级的高级编程语言,它具有简洁、灵活、可嵌入等特点,常被用于嵌入式系统开发、游戏开发以及脚本编写等领域。
本文将介绍Lua的基本语法,包括变量、数据类型、控制流、函数、表等内容。
一、变量和数据类型在Lua中,变量的命名是以字母或下划线开头,由字母、数字和下划线组成。
Lua是动态类型语言,不需要显式地声明变量的类型。
可以使用关键字local声明局部变量,如果不使用local声明,则默认为全局变量。
Lua支持多种数据类型,包括nil、boolean、number、string、function、table等。
其中,nil表示空值,boolean表示布尔值,number表示数值,string表示字符串,function表示函数,table 表示表。
二、控制流1. 条件语句:Lua中的条件语句使用关键字if、elseif和else来实现。
其语法如下:```if condition1 then-- do somethingelseif condition2 then-- do somethingelse-- do somethingend```2. 循环语句:Lua中的循环语句有while和for两种形式。
while 循环的语法如下:```while condition do-- do somethingend```for循环的语法如下:```for var=start, end, step do-- do somethingend```三、函数在Lua中,函数可以通过关键字function来定义。
函数可以有多个参数,也可以返回多个值。
函数的定义和调用示例如下:```-- 定义函数function add(a, b)return a + bend-- 调用函数local result = add(1, 2)print(result) -- 输出:3```四、表Lua中的表类似于其他编程语言中的关联数组或字典,它由一系列键值对组成。
lua基本知识
Lua是一种小巧的脚本语言,由巴西里约热内卢天主教大学的一个研究小组于1993年开发。
它的设计目的是为了灵活嵌入应用程序中,为应用程序提供灵活的扩展和定制功能。
Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译和运行。
Lua的特点包括:
1.轻量级:一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速
度是最快的。
2.可嵌入性:Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用
C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
3.简洁性:Lua的代码简洁优美,易于理解和维护。
4.平台无关性:Lua可以在几乎所有操作系统和平台上编译和运行。
5.扩展性:Lua并没有提供强大的库,这是由它的定位决定的。
所以Lua不
适合作为开发独立应用程序的语言。
Lua的数据类型包括:
1.nil:表示一个无效值(在条件表达式中相当于false)。
2.boolean:包含两个值:false和true。
3.number:表示双精度类型的实浮点数。
4.string:字符串由一对双引号或单引号来表示。
5.function:由 C 或 Lua 编写的函数。
erdata:表示任意存储在变量中的C数据结构。
7.thread:表示执行的独立线路,用于执行协同程序。
8.table:Lua中的表(table)其实是一个"关联数组"(associative
arrays),数组的索引可以是数字、字符串或表类型。
标准lua写法如下:Lua是一种简洁、灵活的脚本语言,其语法也非常易懂。
以下是标准Lua写法的一些建议和示例:1.变量命名:使用有意义的变量名,并采用驼峰式命名法,例如:bashCopy codelocal userName = "John Doe"2.函数定义:使用function 关键字定义函数,函数名采用驼峰式命名法,参数之间用逗号分隔,例如:luaCopy codefunction getUserInfo(userId, userName) -- 函数体end3.条件语句:使用if/else 语句进行条件判断,例如:luaCopy codeif score >= 90 then print("优秀") elseif score >= 80 then print("良好") else print("一般") end4.循环语句:使用for 循环或者while 循环进行迭代,例如:luaCopy code-- for 循环for i = 1, 10 do print(i) end -- while 循环while i <= 10 do print(i) i = i + 1 end5.表(table):Lua 中的表可以用来存储和操作数据,可以通过下标或者键值访问表中的元素,例如:luaCopy code-- 创建一个表local user = { name = "John Doe", age = 30, gender = "male" } -- 访问表中的元素print() print(user["age"])6.模块(module):使用module 关键字定义模块,将相关的函数和变量组织在一起,方便重复使用,例如:luaCopy codemodule("utils") function add(a, b) return a + b end function sub(a, b) return a - b end以上是一些标准的Lua写法,但需要注意的是,Lua非常灵活,可以根据实际情况进行自由组合,这也是Lua的魅力之一。
lua函数定义Lua是一种轻量级、高效的脚本语言,它的函数定义非常灵活和简洁。
Lua中的函数定义有多种形式,下面将详细介绍Lua中函数的定义方式、特点和用法。
在Lua中,我们可以通过以下方式定义一个函数:1. 函数定义方式一:使用function关键字使用function关键字是定义函数最常用的方式,语法格式如下:```function 函数名 (参数列表)函数体end```函数名是函数的名称,参数列表是函数的输入,函数体是一段被执行的代码。
函数体可以包含任意数量的语句,用于完成特定的功能。
在函数中,我们可以使用参数列表中传入的参数进行计算、操作数据等。
以下是一个示例函数:```function add(a, b)return a + bend```这个函数名为add,它有两个参数a和b。
函数体内部只有一条语句:返回a加b的结果。
当我们调用这个函数时,它会返回传入参数的和。
2.函数定义方式二:使用匿名函数Lua中支持使用匿名函数,也称为lambda函数。
匿名函数没有名称,可以直接赋值给变量、作为参数传递给其他函数或直接调用。
语法格式如下:```变量名 = function (参数列表)函数体end```以下是一个示例匿名函数:```add = function (a, b)return a + bend```这个函数与前面定义的函数add相同,只是没有使用function关键字进行定义,而是直接将匿名函数赋值给变量add。
我们可以像调用普通函数一样调用这个匿名函数。
3.函数定义方式三:使用箭头函数Lua 5.3及以上版本中引入了箭头函数的语法,使用箭头符号"->"来定义函数。
语法格式如下:```函数名=(参数列表)->返回值类型函数体end```以下是一个示例箭头函数:```add = (a, b) -> numberreturn a + bend```这个箭头函数与前面的函数add相同,但是定义方式更加简洁。
Lua 5.1 参考手册by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes云风译Copyright © 2006 , PUC-Rio. All rights reserved.1 - 介绍Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。
Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。
它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。
Lua 以一个用clean C 写成的库形式提供。
(所谓Clean C ,指的ANSI C 和C++ 中共通的一个子集)作为一个扩展式语言,Lua 没有"main" 程序的概念:它只能嵌入一个宿主程序中工作,这个宿主程序被称作embedding program或简称为host。
宿主程序可以通过调用函数执行一小段Lua 代码,可以读写Lua 变量,可以注入C 函数让Lua 代码调用。
这些扩展的C 函数,可以大大的扩展了Lua 可以处理事务的领域,这样就可以订制出各种语言,而它们共享一个统一的句法格式的框架。
Lua 的官方发布版就包含了一个叫做lua 的简单的宿主程序,它用Lua 库提供了一个保证独立的Lua 解释器。
Lua 是一个自由软件,它的使用许可决定了对它的使用过程一般没有任何保证。
这份手册中描述的东西的实现,可以在Lua 的官方网站 找到,跟其它的许多参考手册一样,这份文档有些地方比较枯燥。
关于Lua 的设计想法的探讨,可以看看Lua 网站上提供的技术论文。
有关用Lua 编程的细节介绍,可以读一下Roberto 的书,Programming in Lua (Second Edition)。
2 - 语言这一节从词法、语法、句法上描述Lua 。
换句话说,这一节描述了哪些token (符记)是有效的,它们如何被组合起来,这些组合方式有什么含义。
关于语言的构成概念将用常见的扩展BNF 表达式写出。
也就是这个样子:{a} 意思是0 或多个a,[a] 意思是一个可选的a。
非最终的符号会保留原来的样子,关键字则看起来像这样kword,其它最终的符号则写成`=´。
完整的Lua 语法可以在本手册最后找到。
2.1 - 词法约定Lua 中用到的名字(也称作标识符)可以是任何非数字开头的字母、数字、下划线组成的字符串。
这符合几乎所有编程语言中关于名字的定义。
(字母的定义依赖于当前环境:系统环境中定义的字母表中的字母都可以被用于标识符。
)标识符用来命名变量,或作为表的域名。
下面的关键字是保留的,不能用作名字:and break do else elseifend false for function ifin local nil not orrepeat return then true until whileLua 是一个大小写敏感的语言:and 是一个保留字,但是And 和AND 则是两个不同的合法的名字。
一般约定,以下划线开头连接一串大写字母的名字(比如_VERSION)被保留用于Lua 内部全局变量。
下面这些是其它的token :+ - * / % ^ #== ~= <= >= < > =( ) { } [ ]; : , . .. ...字符串既可以用一对单引号引起,也可以是双引号,里面还可以包含类似C 的转义符:'\a' (响铃),'\b' (退格),'\f' (表单),'\n' (换行),'\r' (回车),'\t' (横向制表),'\v' (纵向制表),'\\' (反斜杠),'\"' (双引号),以及'\'' (单引号)。
而且,如果在一个反斜杠后跟了一个真正的换行符,其结果就是在字符串中产生一个换行符。
我们还可以用反斜杠加数字的形式\ddd来描述一个字符。
这里,ddd是一串最多三位的十进制数字。
(注意,如果需要在这种描述方法后接一个是数字的字符,那么反斜杠后必须写满三个数字。
)Lua 中的字符串可以包含任何8 位的值。
包括用'\0' 表示的零。
只有在你需要把不同的引号、换行、反斜杠、或是零结束符这些字符置入字符串时,你才必须使用转义符。
别的任何字符都可以直接写在文本里。
(一些控制符可以会影响文件系统造成某些问题,但是不会引起Lua 的任何问题。
)字符串还可以用一种长括号括起来的方式定义。
我们把两个正的方括号间插入n 个等号定义为第n 级正长括号。
就是说,0 级正的长括号写作[[ ,一级正的长括号写作[=[ ,如此等等。
反的长扩展也作类似定义;举个例子,4 级反的长括号写作]====] 。
一个长字符串可以由任何一级的正的长括号开始,而由第一个碰到的同级反的长括号结束。
整个词法分析过程将不受分行限制,不处理任何转意符,并且忽略掉任何不同级别的长括号。
这种方式描述的字符串可以包含任何东西,当然特定级别的反长括号除外。
另一个约定是,当正的长括号后面立即跟了一个换行符,这个换行符就不包含在这个字符串内。
举个例子,假设一个系统使用ASCII 码(这时,'a' 编码为97 ,换行符编码为10 ,'1' 编码为49 ),下面五种方式描述了完全相同的字符串:a = 'alo\n123"'a = "alo\n123\""a = '\97lo\10\04923"'a = [[alo123"]]a = [==[alo123"]==]数字常量可以分两部分写,十进制底数部分和十进制的指数部分。
指数部分是可选的。
Lua 也支持十六进制整数常量,只需要在前面加上前缀0x 。
下面是一些合法的数字常量的例子:3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x56注释可以在除字符串内的任何地方是以两横(--) 开始。
如果跟在两横后面的不是一个长括号,这就是一个短注释,它的作用范围直到行末;否则就是一个长注释,其作用范围直到遇到反的长括号。
长注释通常被用来临时屏蔽代码块。
2.2 - 值与类型Lua 是一种动态类型语言。
这意味着变量没有类型,只有值才有类型。
语言中不存在类型定义。
而所有的值本身携带它们自己的类型信息。
Lua 中的所有值都是一致(first-class) 的。
这意味着所有的值都可以被放在变量里,当作参数传递到另一个函数中,并被函数作为结果返回。
Lua 中有八种基本类型:nil, boolean, number, string, function, userdata, thread, and table. Nil 类型只有一种值nil,它的主要用途用于标表识和别的任何值的差异;通常,当需要描述一个无意义的值时会用到它。
Boolean类型只有两种值:false和true。
nil和false都能导致条件为假;而另外所有的值都被当作真。
Number表示实数(双精度浮点数)。
(编译一个其它内部数字类型的Lua 解释器是件很容易的事;比如把内部数字类型改作单精度浮点数或长整型。
参见文件luaconf.h 。
)String表示一串字符的数组。
Lua 是8-bit clean 的:字符串可以包含任何8 位字符,包括零结束符('\0') (参见§2.1)。
Lua 可以调用(和处理)用Lua 写的函数以及用C 写的函数(参见§2.5.8).userdata类型用来将任意C 数据保存在Lua 变量中。
这个类型相当于一块原生的内存,除了赋值和相同性判断,Lua 没有为之预定义任何操作。
然而,通过使用metatable (元表),程序员可以为userdata 自定义一组操作(参见§2.8)。
userdata 不能在Lua 中创建出来,也不能在Lua 中修改。
这样的操作只能通过C API。
这一点保证了宿主程序完全掌管其中的数据。
thread类型用来区别独立的执行线程,它被用来实现coroutine (协同例程)(参见§2.11)。
不要把Lua 线程跟操作系统的线程搞混。
Lua 可以在所有的系统上提供对coroutine 的支持,即使系统并不支持线程。
table类型实现了一个关联数组。
也就是说,数组可以用任何东西(除了nil)做索引,而不限于数字。
table 可以以不同类型的值构成;它可以包含所有的类型的值(除nil外)。
table 是lua 中唯一的一种数据结构;它可以用来描述原始的数组、符号表、集合、记录、图、树、等等。
用于表述记录时,lua 使用域名作为索引。
语言本身采用一种语法糖,支持以 的形式表示a["name"]。
有很多形式用于在lua 中创建一个table (参见§2.5.7)。
跟索引一样,table 每个域中的值也可以是任何类型(除nil外)。
特别的,因为函数本身也是值,所以table 的域中也可以放函数。
这样table 中就可以有一些methods了(参见see §2.5.9)。
table,function ,thread ,和(full) userdata 这些类型的值是所谓的对象:变量本身并不会真正的存放它们的值,而只是放了一个对对象的引用。
赋值,参数传递,函数返回,都是对这些对象的引用进行操作;这些操作不会做暗地里做任何性质的拷贝。
库函数type可以返回一个描述给定值的类型的字符串。
2.2.1 - 强制转换Lua 提供运行时字符串到数字的自动转换。
任何对字符串的数学运算操作都会尝试用一般的转换规则把这个字符串转换成一个数字。
相反,无论何时,一个数字需要作为字符串来使用时,数字都会以合理的格式转换为字符串。
需要完全控制数字怎样转换为字符串,可以使用字符串库中的format 函数(参见string.format)。
2.3 - 变量写上变量的地方意味着当以其保存的值来替代之。
Lua 中有三类变量:全局变量,局部变量,还有table 的域。
一个单一的名字可以表示一个全局变量,也可以表示一个局部变量(或者是一个函数的参数,这是一种特殊形式的局部变量):var ::= NameName 就是§2.1中所定义的标识符。
任何变量都被假定为全局变量,除非显式的以local 修饰定义(参见§2.4.7)。