Lua
Lua语言是在1993年由巴西一个大学研究小组发明的,其设计目标是作为嵌入式程序移植到其他应用程序。它是由C语言实现的,虽然简单小巧但功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,如暴雪公司的“魔兽世界”和“愤怒的小鸟”。Nginx将Lua语言作为扩展,Redis则将Lua作为脚本语言来帮助开发者定制自己的Redis命令。
Redis 2.6版本通过内嵌支持Lua环境,也就是说一般的运用是不需要单独安装Lua的。
在Redis使用Lua脚本的好处
- 减少网络开销:在Lua脚本中可以把多个命令放在同一个脚本中运行。
- 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入(Redis执行命令是单线程)。
- 复用性:客户端发送的脚本会永远存储在Redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑。
为了方便学习Lua语言,我们还是建议单独安装一个Lua。
安装Lua
Lua在Linux中的安装:
- 下载Lua源码包:
wget http://www.lua.org/ftp/lua-5.3.6.tar.gz
- 解压源码包:
tar -zxvf lua-5.3.6.tar.gz
- 进入解压的目录:
cd lua-5.3.6
- 编译并安装:
make linux sudo make install
- 如果报错找不到
readline/readline.h
,可以通过以下命令安装相关依赖:
然后重新执行sudo yum -y install libtermcap-devel ncurses-devel libevent-devel readline-devel
make linux
和make install
。
安装完成后,直接输入lua
命令即可进入Lua的控制台。
Lua基本语法
Lua学习起来非常简单,当然它也是一个独立的语言,自成体系。本节只讲述基础部分,如果工作中有深研Lua的需要,可以参考《Lua程序设计》,作者是罗伯托·伊鲁萨利姆斯基(Roberto Ierusalimschy)。
Hello World
在命令行中输入以下代码并查看效果:
print("Hello World!")
或者编写一个Lua脚本,然后执行它:
-- hello.lua
print("Hello World!")
注释
-
单行注释:
-- 这是单行注释
-
多行注释:
--[[ 这是多行注释 --]]
标示符
Lua标示符用于定义一个变量、函数或其他用户定义的项。标示符以一个字母或下划线开头,后接零个或多个字母、下划线、数字。Lua区分大小写。以下是一些正确的标示符:
var1, _var, var_1
关键词
以下是Lua的保留关键词,不能作为常量、变量或其他用户自定义标示符使用:
and, break, do, else, elseif, end, false, for, function, if, in, local, nil, not, or, repeat, return, then, true, until, while
全局变量
在默认情况下,变量总是全局的。给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量会返回nil
。要删除一个全局变量,只需将其赋值为nil
。
Lua中的数据类型
Lua是动态类型语言,变量不需要类型定义,只需赋值即可。Lua中有8个基本类型:nil
、boolean
、number
、string
、userdata
、function
、thread
和table
。
使用type
函数测试变量或值的类型:
print(type(123)) -- 输出:number
print(type("hello")) -- 输出:string
常用数据类型
- nil 类型表示一种没有任何有效值,只有一个值:
nil
。给全局变量或表里的变量赋nil
值等同于删除它们。 - boolean 类型只有两个值:
true
和false
。false
和nil
为假,其他都为真。 - number 类型默认是双精度类型。
- string 用一对双引号或单引号表示,也可以用
[[
与]]
表示多行文本。 - table 可以作为数组或哈希表使用,初始索引一般从1开始。例子:
-- 数组 local array = {1, 2, 3} -- 哈希表 local hash = {name="John", age=30}
Lua中的函数
函数以function
开头,以end
结尾。定义一个简单的字符串连接函数:
function concat(str1, str2)
return str1 .. str2
end
print(concat("hello", " world"))
Lua中的控制语句
循环控制
Lua支持while
、for
和repeat...until
循环。
-
数值for循环:
for i = 1, 10, 1 do print(i) end
-
泛型for循环:
local array = {"one", "two", "three"} for i, v in ipairs(array) do print(i, v) end
条件控制
Lua支持if
、if...else
和if嵌套
语句。
-
if语句:
if condition then -- 代码块 end
-
if…else语句:
if condition then -- true代码块 else -- false代码块 end
Lua中的运算符
Lua提供了算术运算符、关系运算符和逻辑运算符。
算术运算符
操作符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
^ | 乘幂 |
- | 负号 |
关系运算符
操作符 | 描述 |
---|---|
== | 等于 |
~= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
逻辑运算符
操作符 | 描述 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑非 |
Lua其他特性
Lua还支持模块与包、元表、协程、文件IO操作、错误处理、代码调试、垃圾回收和面向对象等特性。更多详情请参考相关书籍。
Java对Lua的支持
在Java生态中,对Lua的支持主要通过LuaJ,这是一个Java的Lua解释器,基于Lua 5.2.x版本。
Maven依赖
<dependency>
<groupId>org.luaj</groupId>
<artifactId>luaj-jse</artifactId>
<version>3.0.1</version>
</dependency>
参考代码
请参考luaj
模块,注意本代码仅供参考,在工作中需要使用Lua语言或在Java中执行Lua脚本时,请自行仔细学习Lua语言和luaj-jse的使用。