概况
类型 | 描述 |
---|---|
nil | 只有值 nil 属于该类,在条件表达式中相当于 false |
boolean | true 或 false |
number | 双精度浮点数 |
string | 字符串,通过单引号或者双引号来表示 |
function | C 或者 Lua 函数 |
userdata | 存储在任意变量中的 C 数据结构 |
thread | 执行的独立线路 |
table | 一个关联数组,索引可以为 number,string 或者 table。table 的创建通过构造表达式,最简单为 {},即为空表。 |
nil
- nil 表示没有一个有效值;
- 可以使用 nil 给全局变量或者 table 赋值代表删除;
- 比较时用双引号。
boolean
只有 false 与 nil 为假。其余(包括0)为真。
number
默认只有一种 number 类型 - double(可以在 luaconf.h 更改定义)。
string
- 通过单引号或者双引号来表示;
- 也可以使用
[[]]
来表示一块字符串;1
2
3
4
5
6
7
8html = [[
<html>
<head></head>
<body>
<a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]] - 在对数字字符串进行算术操作时,Lua 会将其转化为数字;
1
2
3
4
5
6
7
8print("2" + 6)
-- 8.0
print("2" + "6")
-- 8.0
print("2 + 6")
-- 2 + 6
print("-2e2" * "6")
-- -1200.0 - 字符串连接使用
..
;1
2print("abc".."def")
-- abcdef - 计算长度使用
#
;1
2
3len = "robber.ltd"
print(#len)
-- 10table
- Lua 中,table 的创建是通过”构造表达式”来完成的。{}是最简单的构造表达式,用来创建空表。也可以添加数据,直接初始化表;
1
2local tab1 = {}
local tab2 = {"one","two","three","four"} - Lua 中的 table 是一个关联数组,索引可以是 number 或者 string;
1
2
3
4
5
6
7
8
9
10
11
12tab = {}
tab["key"] = value
key = 10
tab[key] = 22
tab[key] = tab[key] + 22
for k, v in pairs(tab) do
print(k .. " : " .. v);
end
--[[
key : value
10 : 44
--]] - 不同于其他语言,Lua 将表的初始索引设置为 1(就很烦呐);
- table 不会固定长度,当有新数据添加时自动增长,没初始化的 table 都是 nil。
function
- 在 Lua 中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里:
1
2
3
4
5
6
7
8
9
10
11
12
13function func1(n)
if n == 0 then
return 1
else
return n * func1(n - 1)
end
end
print(func1(5))
-- 120
func2 = func1
print(func2(5))
-- 120 - function 可以以匿名函数(anonymous function)的方式通过参数传递:
1
2
3
4
5
6
7
8
9
10
11
12function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
return key.."="..val;
end
); - function 可以实现多个返回值,其返回匹配串的”开始与结束下标”
1
2
3
4
5
6
7function ReturnText()
return 10,20,30
end
a,b,c=ReturnText()
print(a,b,c)
-- 10 20 30 - 可变参数
Lua中在函数参数列表中使用三点(…) 表示函数有可变的参数。Lua 将参数放在一个叫 arg 的表中,#arg 代表传入的参数格式。在 arg 中不仅保存了我们的参数还保存了参数的个数。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function average(...)
local res=0
local arg = {...}
for k, v in pairs(arg) do
res= res + v
end
print(res/#arg)
end
average(10)
-- 10
average(1,20)
-- 10.5
average(5,15,30)
-- 16.666666666667
thread
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
userdata
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。