安装

官方安装地址:http://www.lua.org/download.html

Linux

  1. # curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
  2. # tar zxf lua-5.3.5.tar.gz
  3. # cd lua-5.3.5
  4. # make linux test

安装可能会出现如下错误,stackoverflow解决方案:https://stackoverflow.com/questions/23085076/readline-readline-h-file-not-found

  1. lua.c:82:31: fatal error: readline/readline.h: No such file or directory
  2. #include <readline/readline.h>
  3. ^
  4. compilation terminated.
  5. make[2]: *** [lua.o] Error 1
  6. make[2]: Leaving directory `/opt/source/lua-5.3.5/src'
  7. make[1]: *** [linux] Error 2
  8. make[1]: Leaving directory `/opt/source/lua-5.3.5/src'
  9. make: *** [linux] Error 2

表示缺少libreadline依赖包
centos 需要安装的是

  1. yum install -y readline-devel

debian需要安装的是

  1. sudo apt install libreadline-dev -y

再次安装

  1. sudo make install
  2. 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
  3. cd src && install -p -m 0755 lua luac /usr/local/bin
  4. cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
  5. cd src && install -p -m 0644 liblua.a /usr/local/lib
  6. cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1

MacOS

  1. curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
  2. tar zxf lua-5.3.0.tar.gz
  3. cd lua-5.3.0
  4. make macosx test
  5. make install

或者直接使用brew安装

  1. $ brew install lua

HelloWorld

交互式

Lua 交互式编程模式可以通过命令lua或者lua -i 来启用:

  1. # lua
  2. Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
  3. >

输入以下命令,按回车执行打印命令

  1. > print("Hello World!")
  2. Hello World!

退出交互式直接ctrl+c

脚本式

创建hello.lua文件 输入以下内容

  1. print("Hello Lua")

执行hello.lua 文件

  1. # lua hello.lua
  2. Hello Lua

也可以将修改文件首行内容为如下形式来执行脚本。
首先确定以下lua执行文件的位置,添加:#!/usr/local/bin/lua,指定了 Lua 的解释器 /usr/local/bin/lua

  1. # which lua
  2. /usr/local/bin/lua

同时需要设置文件的可执行权限

  1. # chmod +x hello.lua
  2. # ./hello.lua
  3. Hello Lua

注释

单行注释

  1. 两个减号是单行注释:
  1. --注释内容

多行注释

  1. --[[
  2. 多行注释
  3. 多行注释
  4. --]]

变量

type

  1. print(type("hello world"))
  2. print(type(true))
  3. print(type(250))
  4. print(type(nil))
  5. print(type(print))

输出结果

  1. string
  2. boolean
  3. number
  4. nil
  5. 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。

  1. > print(a)
  2. nil
  3. > a = 1
  4. > print(a)
  5. 1
  1. 如果你想删除一个全局变量,只需要将变量赋值为nil
  1. > a = nil
  2. > print(a)
  3. nil

因此可以认为当且仅当一个变量不等于nil时,这个变量即存在。

局部变量

变量名称 前加修饰符 local,代表的含义就是局部变量

基本类型

type 函数测试给定变量或者值的类型:

  1. > print(type(a))
  2. nil
  3. > print(type("hello"))
  4. string

nil

只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)nil 类型表示一种没有任何有效值,它只有一个值nil,
a没有赋值,打印变量a的类型,便会输出一个 nil 值:

  1. > print(type(a))
  2. nil

对于全局变量和 table,nil 还有一个”删除”作用,给全局变量使用

  1. > a = 1
  2. > print(a)
  3. 1
  4. > a = nil
  5. > print(a)
  6. nil

table 表里的变量赋一个 nil 值,等同于把它们删掉,执行下面代码就知

  1. > t = { a = 1 , b = 2}
  2. > for k ,v in pairs(t) do
  3. >> print(k .. ':' .. v)
  4. >> end
  5. b:2
  6. a:1
  7. > t.a = nil
  8. > for k ,v in pairs(t) do
  9. >> print(k .. ':' .. v)
  10. >> end
  11. b:2

注意Lua用的是两个圆点 ..表示字符串连接符,大部分开发语言使用的加号+
判断nil类型 作比较时应该加上双引号 “:

  1. > type(a)==nil
  2. false
  3. > type(a)=="nil"
  4. true

type(X)==nil 结果为 false 的原因是因为 type(type(X))==string

boolean

布尔类型,可选值 true/false;
Lua 中 nil 和 false 为“假”,其它所有值均为true。包括0 和空字符串也表示的是true;

  1. local a = true
  2. if a then
  3. print("a")
  4. else
  5. print("not a")
  6. end

打印结果

  1. a
  1. local c= nil
  2. if c then
  3. print("c")
  4. else
  5. print("not c")
  6. end

打印结果

  1. not c

number

Number 类型用于表示实数,和 C/C++ 里面的 double 类型很类似。可以使用数学函数 math.floor(向下取整)和 math.ceil(向上取整)进行取整操作。

  1. local pai = 3.1415
  2. local score = 98.5
  3. print(math.floor(pai)) --向下取整
  4. print(math.ceil( score )) --向上取整

打印结果

  1. 3
  2. 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 语言更多的基本原语和特性,因此功能上也要更加强大。