PS:由于公司项目中用到Lua,所以准备学习一下,这里做下学习笔记。

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

基本语法

交互式编程

lua -i 进入交互式编程

脚本式编程

新建一个hello.lua文件,将lua代码写在hello.lua中

print("Hello world")

执行:

lua hello.lua

结果:

Hello rorld

也可以将代码改为如下形式:

1
2
#!/usr/local/bin/lua
print("Hello world")

执行:

./hello.lua

结果和上面一样。

这种模式称为脚本式编程。

注释

单行注释:

--

多行注释:

1
2
3
4

多行注释
多行注释
--]]

标识符

以字母或者下划线_开头,后面加上0个或多个字母,下划线,数字。(标识符区分大小写)

关键字

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

Lua变量

  • 全局变量 -默认申明的都是全局变量,除非申明为局部变量
  • 局部变量-指定为local时
  • 表字段-特殊变量,可以保存除了nil之外的任何内容,包括函数

变量定义

格式:

type variable_list

示例:

1
2
local i,j
local a

变量初始化:

type variable_list = value_list

示例:

1
2
3
4
5
6
local a,b = 10,20
print("a:",a)
print("b",b)
b,a = a,b
print("a:",a)
print("b:",b)

结果:

1
2
3
4
5
a:	10
b: 20
------
a: 20
b: 10

Lua数据类型

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua中的值类型有八种:

数据类型 描述
nil 无效值,没有被赋值,条件表达式中为false
boolean false和true
number 双精度类型的实浮点数
string 字符串,单引号或双引号内
function 表示C或者Lua编写的函数
userdata 表示C语言数据结构
thread 表示独立的执行线程,它用于实现协同程序
table 表示普通数组,符号表,集合,记录,图形,树等,并实现关联数组。 它可以保存任何值(除了nil)
1
2
3
4
5
6
7
print(type("Hello world"))    --string
print(type(123)) --number
print(type(print)) --function
print(type(type)) --function
print(type(true)) --boolean
print(type(nil)) --nil
print(type(type(X))) --string

运行结果:

1
2
3
4
5
6
7
string
number
function

boolean
nil
string

nil

nil 表示无效值,如一个没有被赋值的变量

1
2
print(type(a))
结果是 nil

对于全局变量和 table,nil 还有一个”删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉

1
2
3
4
5
6
7
8
9
tab = {key1 = "val1",key2 = "val2","val3"}
for k,v in pairs(tab) do
print(k.."---"..v)
end
print("-------------")
tab.key1 = nil
for k,v in pairs(tab) do
print(k.."---"..v)
end

结果:

1
2
3
4
5
6
1---val3
key1---val1
key2---val2
-------------
1---val3
key2---val2

type(type(x)) 结果是string

type(x) == nil 结果是false

type(x) == “nil” 结果是true

boolean

boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真”

number

Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

string

字符串由一对双引号或单引号来表示

1
2
string1 = "hello world"
string2 = 'hello world2'

也可以用[[]]表示一块字符串

1
2
3
4
5
6
7
8
html = [[
<html>
<head></head>
<body>
<a href="http://www.baidu.com/">百度</a>
</body>
</html>
]]

在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:

1
2
3
4
print("1" + 1)
print("1" + "1")
print("1+1")
print("Hello" + 1)

结果:

1
2
3
4
5
2.0
2.0
1+1
lua: /Users/wufei/project/lua_workspace/data_type.lua:36: attempt to perform arithmetic on a string value
stack traceback:

“Hello” + 1 执行报错

字符串的拼接用 ..

1
2
print("a" .. "b")
print(123 .. 456) --数字和.. 之间一定要有空格,不然会报错

使用#来计算字符串长度

print(#"hello world")

结果为:11

table(数组,字典 )

table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

pairs 遍历所有元素 字典无序

ipairs 只能遍历数组,不能遍历字典类型,只能遍历没有key的元素

1
2
local table1 = {}			--方式一
local table2 = {"a","b","c","d"}

Lua的table是一个”关联数组”,数组的索引可以是数字或者是字符串

1
2
3
4
5
6
7
8
a = {}
a["key"] = "value"
key = 1
a[key] = 2
a[key] = a[key] + 1
for k,v in pairs(a) do
print(k..":"..v)
end

结果:

1
2
1:3
key:value

Lua 数组默认索引从1开始:

1
2
3
4
local table = {"a","b","c"}
for key,value in pairs(table) do
print("key",key)
end

结果:

1
2
3
key	1
key 2
key 3

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

1
2
3
4
5
6
7
local table = {}
for i = 1,10 do
table[i] = i
end
table["key"] = "value"
print(table["key"])
print(table["a"])

结果:

1
2
value
nil

因为key为a的元素没有初始化,所以为nil

table 的长度和字符串长度一样,用#来获取:

print(#table)

function

Lua中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里:

1
2
3
4
5
6
function test(a)
print("test:"..a)
end
test(1)
test2 = test
test2(2)

结果:

1
2
1
2

function 可以以匿名函数的方式通过参数传递:

1
2
3
4
5
6
7
8
9
10
11
12
function testFun(tab,fun)
for k,v in pairs(tab) do
print(fun(k,v))
end
end

local tab = {k1 = "v1",k2 = "v2"}
testFun(tab,
function(k,v)
return k.."="..v
end
)

结果:

1
2
k2=v2
k1=v1

thread

lua中,最主要的线程是协同程序

userdata

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

运算符

  • 算术运算符

  • 关系运算符

  • 逻辑运算符

  • 其他运算符

算术运算符

1
2
3
4
5
6
7
+  加法运算
- 减法运算
* 乘法运算
/ 除法运算
% 取模运算
^ 指数运算
- 取负

关系运算符

1
2
3
4
5
6
==
~= 不等于
>
<
>=
<=

逻辑运算符

1
2
3
and
or
not

其他运算符

1
2
..  字符串拼接
# 取字符串或者table的长度

参考资料:

http://www.runoob.com/lua/lua-tutorial.html