安装
官方安装地址:http://www.lua.org/download.html
Linux
# curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
# tar zxf lua-5.3.5.tar.gz
# cd lua-5.3.5
# make linux test
安装可能会出现如下错误,stackoverflow解决方案:https://stackoverflow.com/questions/23085076/readline-readline-h-file-not-found
lua.c:82:31: fatal error: readline/readline.h: No such file or directory
#include <readline/readline.h>
^
compilation terminated.
make[2]: *** [lua.o] Error 1
make[2]: Leaving directory `/opt/source/lua-5.3.5/src'
make[1]: *** [linux] Error 2
make[1]: Leaving directory `/opt/source/lua-5.3.5/src'
make: *** [linux] Error 2
表示缺少libreadline依赖包
centos 需要安装的是
yum install -y readline-devel
debian需要安装的是
sudo apt install libreadline-dev -y
再次安装
sudo make install
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.3 /usr/local/lib/lua/5.3
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1
MacOS
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install
或者直接使用brew安装
$ brew install lua
HelloWorld
交互式
Lua 交互式编程模式可以通过命令lua或者lua -i 来启用:
# lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
>
输入以下命令,按回车执行打印命令
> print("Hello World!")
Hello World!
脚本式
创建hello.lua文件 输入以下内容
print("Hello Lua")
执行hello.lua 文件
# lua hello.lua
Hello Lua
也可以将修改文件首行内容为如下形式来执行脚本。
首先确定以下lua执行文件的位置,添加:#!/usr/local/bin/lua,指定了 Lua 的解释器 /usr/local/bin/lua
# which lua
/usr/local/bin/lua
同时需要设置文件的可执行权限
# chmod +x hello.lua
# ./hello.lua
Hello Lua
注释
单行注释
两个减号是单行注释:
--注释内容
多行注释
--[[
多行注释
多行注释
--]]
变量
type
print(type("hello world"))
print(type(true))
print(type(250))
print(type(nil))
print(type(print))
输出结果
string
boolean
number
nil
function
变量命名
Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。
不建议使用下划线加大写字母的标示符,因为Lua的保留字也是这样的 一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。
变量名字区分大小写的,A和a是两个不同的变量
定义一个变量的方法就是赋值。”=”操作就是用来赋值的。
关键词:
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while |
全局变量
在默认情况下,变量是全局的。全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
> print(a)
nil
> a = 1
> print(a)
1
如果你想删除一个全局变量,只需要将变量赋值为nil。
> a = nil
> print(a)
nil
因此可以认为当且仅当一个变量不等于nil时,这个变量即存在。
局部变量
基本类型
type 函数测试给定变量或者值的类型:
> print(type(a))
nil
> print(type("hello"))
string
nil
只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)nil 类型表示一种没有任何有效值,它只有一个值nil,
a没有赋值,打印变量a的类型,便会输出一个 nil 值:
> print(type(a))
nil
对于全局变量和 table,nil 还有一个”删除”作用,给全局变量使用
> a = 1
> print(a)
1
> a = nil
> print(a)
nil
table 表里的变量赋一个 nil 值,等同于把它们删掉,执行下面代码就知
> t = { a = 1 , b = 2}
> for k ,v in pairs(t) do
>> print(k .. ':' .. v)
>> end
b:2
a:1
> t.a = nil
> for k ,v in pairs(t) do
>> print(k .. ':' .. v)
>> end
b:2
注意Lua用的是两个圆点 ..表示字符串连接符,大部分开发语言使用的加号+
判断nil类型 作比较时应该加上双引号 “:
> type(a)==nil
false
> type(a)=="nil"
true
type(X)==nil 结果为 false 的原因是因为 type(type(X))==string。
boolean
布尔类型,可选值 true/false;
Lua 中 nil 和 false 为“假”,其它所有值均为true。包括0 和空字符串也表示的是true;
local a = true
if a then
print("a")
else
print("not a")
end
打印结果
a
local c= nil
if c then
print("c")
else
print("not c")
end
打印结果
not c
number
Number 类型用于表示实数,和 C/C++ 里面的 double 类型很类似。可以使用数学函数 math.floor(向下取整)和 math.ceil(向上取整)进行取整操作。
local pai = 3.1415
local score = 98.5
print(math.floor(pai)) --向下取整
print(math.ceil( score )) --向上取整
打印结果
3
99
Lua 和 LuaJIT 的区别
Lua 非常高效,它运行得比许多其它脚本(如 Perl、Python、Ruby)都快,这点在第三方的独立测评中得到了证实。尽管如此,仍然会有人不满足,他们总觉得“嗯,还不够快!”。LuaJIT 就是一个为了再榨出一些速度的尝试,它利用即时编译(Just-in Time)技术把 Lua 代码编译成本地机器码后交由 CPU 直接执行。LuaJIT 2 的测评报告表明,在数值运算、循环与函数调用、协程切换、字符串操作等许多方面它的加速效果都很显著。凭借着 FFI 特性,LuaJIT 2 在那些需要频繁地调用外部 C/C++ 代码的场景,也要比标准 Lua 解释器快很多。目前 LuaJIT 2 已经支持包括 i386、x86_64、ARM、PowerPC 以及 MIPS 等多种不同的体系结构。
LuaJIT 是采用 C 和汇编语言编写的 Lua 解释器与即时编译器。LuaJIT 被设计成全兼容标准的 Lua 5.1 语言,同时可选地支持 Lua 5.2 和 Lua 5.3 中的一些不破坏向后兼容性的有用特性。因此,标准 Lua 语言的代码可以不加修改地运行在 LuaJIT 之上。LuaJIT 和标准 Lua 解释器的一大区别是,LuaJIT 的执行速度,即使是其汇编编写的 Lua 解释器,也要比标准 Lua 5.1 解释器快很多,可以说是一个高效的 Lua 实现。另一个区别是,LuaJIT 支持比标准 Lua 5.1 语言更多的基本原语和特性,因此功能上也要更加强大。