lua是一款小巧的脚本语言,是巴西里约热内卢天主教大学里的一个研究小组于1993年开发其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译、运行。lua并没有提供强大的库,这是由它的定位决定的,所以lua不适合作为开发独立应用程序的语言,在游戏开发等领域使用较多。

1. 引子1.1 保留字

保留字的概念不用多说,lua中的保留字如下21个:

andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhile1.2 注释

注释分为行注释和块注释:

--行注释--print("thelinenotes")--块注释--[[print("thefirstblocknotes")print("thesecondblocknotes")]]

使用块注释时,建议用如下形式:

--[[print("thefirstblocknotes")print("thesecondblocknotes")--]]

这种形式的好处是,如果想要取消块注释,只需在块注释开始前再加一个-符号,如此可以将块注释的开始行和结束行都变为行注释:

---[[print("thefirstblocknotes")print("thesecondblocknotes")--]]

这里还要提到的一点是,如果在被注释的内容中出现]]的解决方法。在lua5.1版本后,可以通过在两个相连的中括号间添加相等数量的=来解决,如此便可在注释内容中使用]]

--[===[print("thefirstblocknotes")print("thesecondblocknotes")[[]]--]===]1.3 shebang

shellpython一样,在lua中也有shebang,放于.lua文件的第一行,如果改文件有执行权限,则可以直接执行:

#!/bin/bash#!/usr/bin/envlua2. 类型与值

lua中共有8种基础类型:

nilbooleannumberstringuserdatafunctionthreadtable

nil即为空,相当于python中的None和JavaScript中的undefined/null,比较简单;userdata为自定义变量,thread与多线程、并发有关,这两种变量不必在初学阶段做过多纠结,下面我们主要看看number,boolean,string,table和function。

2.1 判断值的类型:

内置的type()函数可以返回变量或值的类型:

print(type(nil))--nilprint(type(true))--booleanprint(type(12.2))--numberprint(type("hello"))--stringprint(type(print))--functionprint(type(type(nil)))--string此处无论type中的是何值,print出的都是string,因为type()的返回值是string类型2.2 lua中的number

lua中没有像C/C++/Java中的整型(int/Integer),所有的数字均为双精度浮点数(double/Double)。在lua中可以使用科学计数法表示数字常量,下面几种写法都是允许的:

43.16.6e+52.5e-32.3 lua中的boolean

lua中的boolean值和pythonJavaScript中的boolean有些区别。在pythonJavaScript中,None/null,空字符串和数字0在逻辑判断中都会转换为false,而在lua中,空字符串和数字0在逻辑判断中都会转换为true,只有nil在逻辑判断中都会转换为false:

if""and0thenprint(true)elseprint(false)end--[[输出结果为true--]]2.4 lua中的string

lua中的字符串是不可变量,这和python中相同,与C/C++/Java中不同。与pythonJavaScript一样,lua中既可以使用单引号',也可以使用双引号"来声明字符串:

stringA="ThisisstringA"stringB='ThestringB'

lua中也有转义字符,如定义一个分为两行的字符串:

stringTwoLine="Thisisthefirstline.\nThesecondline."

lua中,可以使用一对匹配的` `来界定一个字符串,如果此时该字符串的第一个字符是换行符,该换行符将会被lua忽略,此外在该字符串中所有的转义字符如\n\t等都会被忽略,即所有的转义字符在` `内失效。该用法通常用来书写含有代码的字符串:

indexPage=[[<html><head><title>HTMLTitle</title></head><body><div>HelloWorld</div></body></html>]]print(indexPage)

与其他大多数编程语言不同,lua中不能使用+来连接字符串,而要用..来进行连接:

>print("hello"+"world")stdin:1:attempttoperformarithmeticonastringvaluestacktraceback:stdin:1:inmainchunk[C]:?>print("hello".."world")--输出结果helloworld

lua中计算字符串长度有些新奇,这里对比pythonJavaScript来看一下,方便加深印象:

len('helloworld')#python'helloworld'.length//JavaScript#'helloworld'--lua

lua中有两个内置函数tonumber()tostring()用于将string转换为number及将number转换为string,在转换失败时不会抛出异常,而是将其转换为nil:

tonumber('1.173')--1.173tonumber('hello')--niltostring(3.14159)--'3.14159'2.5 lua中的table

table是lua中仅有的数据结构机制。table非常类似于python中的dict,只要hashable的值均可作为key的,可以简单的认为string和number均可作为key,如:

dataTable,newTable={},{}--初始化tabledataTable["name"]="jiagoushi"--赋值,key="name",value="jiagoushi"print(dataTable["name"])--取值,值为"jiagoushi"print(dataTable.name)--另一种取值方式,值为"jiagoushi"dataTable[1]=233print(dataTable[1])--取值,值为233dataTable[2.2]="Beijing"print(dataTable[2.2])--取值,值为"Beijing"print("dataTable的长度为"..#dataTable)--与取string长度相同,#也可以用来取table的长度fori=1,10donewTable[i]=i*2endforj=1,#newTabledo--循环输出该table中的值print("newTable["..j.."]="..newTable[j])end

关于lua中table的key值,如果使用整数的话,通常会以1作为起始值,这点与绝大多数编程语言习惯从0开始不同,因为lua中有不少机制依赖该惯例,因此应该多加注意。

2.5 lua中的function

pythonJavaScript相同,在lua中,函数被视为第一类值,可以被自由传递。看一下函数的基本用法:

--函数定义,有一个形参namefunctionsayHello(name)print("Hello,"..name)end--函数调用sayHello("LiLei")--"Hello,LiLei"sayHello("HanMeimei")--"Hello,HanMeimei"

有关函数的高阶内容,放到之后的博客中继续讲解,敬请关注。

完。