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的类型。
先看看简单类型(nil
和boolean
),其他类型在后面会学到。
简单类型
nil
只有nil
值的类型,主要作用就是与其他所有值进行区分,Lua使用nil
来表示无效值的情况。
boolean
只有两个值:true
和false
,它们代表了传统布尔值。但boolean
值并非是用于条件测试的唯一方式,Lua将除了false
和nil
外的所有其它值视为真(这表示0和空字符串也是真)。
逻辑运算符
接下来看看Lua的逻辑运算符:
and:格式为
op1 and op2
,如果op1
为假,则返回op1
;否则返回op2
。4 and 5 --> 5 nil and 13 --> nil false and 13 --> false
or:格式为
op1 or op2
,如果op1
不为假,则返回op1
;否则返回op2
。0 or 5 --> 0 false or "hi" --> hi nil or false --> false
and 和 or 都遵循短路求值原则,即只在必要时才对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中数值较大的一个。
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"