01-Lua语言入门

争取两三周入门Lua!

Helloworld

配置好Lua环境后,便能编写经典的hello world了:

print("Hello World!")	-- 输出 Hello World!

程序段

把Lua语言执行的每一段代码(文件/交互模式下的一行)称为一个 程序段(Chunk),即一组命令或表达式组成的序列。

交互模式

除了将源码保存.lua文件并运行,我们还能使用交互模式下的独立解释器来运行Lua代码。要想使用交互模式,先在终端内输入:

lua54

然后就能进行交互了:

在Lua5.3之前的老版本中,还需要在表达式前加上一个等号,如= a + 2

实际上,这里应该输入lua,但为了区分版本,这里用lua54。

如果想退出交互模式,可以通过输入EOF控制字符或调用操作系统库的exit函数(即执行os.exit())退出。

如果想在执行完某文件的程序段后启动交互模式,只需在终端输入以下代码即可:

lua54 -i xxx.lua

调用dofile()

如果想在程序端中调用其他文件的代码,可以使用dofile()函数。例如,有一个库文件lib1.lua

function norm(x, y)
    return math.sqrt(x ^ 2 + y ^ 2)
end

然后在交互模式中可以这样用:

dofile("lib1.lua") 
norm(1, 2) 

词法规范

标识符

由任意字母(A-Z, a-z),数字和下划线组成的字符串(不能以数字开头)。其中,“下划线+大写字母”(如_VERSION)组成的标识符常被Lua用作特殊用途,应避免使用。

保留字

以下是Lua语言的保留字,它们不能被用作标识符:

and		break		do		else	elseif
end		false		goto	for		function
if		in			local	nil		not
or		repeat		return	then	true
until	while

注释

print("123")	-- 单行注释

--[[多行
长注释
]]

-- 多行注释的正确用法:
--[[ 弃用这段代码
print(10)
--]]

---[[ 启用这段代码
print(10)
--]]

全局变量

在Lua中,全局变量无需声明即可使用,使用未经初始化的全局变量也不会导致错误,它的结果是nil

b		--> nil
b = 10
b		--> 10

当把nil赋值给全局变量时,Lua会回收该变量占用的内存。

类型和值

Lua是一种动态类型语言,在这种语言中没有类型定义,每个值都带有其自身的类型信息。一共有八种基本类型:nil空类型,boolean布尔类型,number数值类型,string字符串类型,userdata用户数据类型,function函数类型,thread线程类型,table表类型。可以使用type(x)获取变量x的类型。

先看看简单类型(nilboolean),其他类型在后面会学到。

简单类型

nil

只有nil值的类型,主要作用就是与其他所有值进行区分,Lua使用nil来表示无效值的情况。

boolean

只有两个值:truefalse,它们代表了传统布尔值。但boolean值并非是用于条件测试的唯一方式,Lua将除了falsenil外的所有其它值视为真(这表示0和空字符串也是真)

逻辑运算符

接下来看看Lua的逻辑运算符:

  1. and:格式为 op1 and op2,如果op1为假,则返回op1;否则返回op2

    4 and 5			--> 5
    nil and 13		--> nil
    false and 13	--> false
  2. or:格式为op1 or op2,如果op1不为假,则返回op1;否则返回op2

    0 or 5			--> 0
    false or "hi"	--> hi
    nil or false	--> false

andor 都遵循短路求值原则,即只在必要时才对op2求值。在Lua语言中,形如x = x or v的惯用写法非常有用,它等同于if not x then x = v end,即当x未被初始化时,将其默认值设为v。还有形如a and b or c的表达式也很有用,当b不为假时,就是C语言的a ? b : c,例如可以用 (x > y) and x or y选出x和y中数值较大的一个。

  1. not:格式为 not op,它永远返回Boolean类型的值:

    not nil		--> true
    not false	--> true
    not not nil	--> false

独立解释器

独立解释器(也称lua.c/lua),是一个可以直接使用Lua语言的小程序。在linux中,如果不想显式调用解释器来运行脚本,需要在脚本文件上添加#!/usr/bin/env lua#!/usr/local/bin/lua

来看看如何使用独立解释器,它的命令格式如下:

lua54 [options] [script [args]]

可用的部分参数如下:

  • -e:允许我们直接在命令行中输入代码,如 lua54 -e "print(123)"
  • -l:用于加载库,如lua54 -l -llib -e "x = 10"会先加载lib库,然后执行x=10,之后进入交互模式。

我们可通过预定义的全局变量arg来获取解释器传入的参数,例如 lua54 helloworld.lua abc,编译器在运行代码前会创建一个名为arg的表,其中存储了所有的命令行参数:

arg[-1]		--> "lua54"
arg[0]		--> "helloworld.lua"
arg[1]		--> "abc"