Lua 语言
数据类型
Lua 有以下数据类型:
- nil:表示一个无效值,相当于 NULL。
- boolean:true 或 false。
- number:整数或浮点数。
- string:字符串。
- function:函数。
- userdata:用户数据。
- thread:线程。
- table:表。
nil
nil 表示一个无效值,相当于 NULL。
一个变量在第一次赋值前的默认值是 nil。
lua
local x = nil
print(x) -- nil
print(nil) -- nil
boolean
boolean 类型只有 true 和 false 两个值。
Lua 中 nil 和 false 为"假",其它所有值均为"真"。比如 0 和空字符串("") 就是"真" 。
lua
print(true) -- true
print(false) -- false
print(nil) -- nil
print(123) -- true
number
number 类型可以表示整数或浮点数。
可以使用数学函数 math。
floor(向下取整) 和 math.ceil(向上取整) 进行取整操作
底层实现:一般地,Lua 的 number 类型就是 C/C++中的 long long int 或 double
类型来实现的 ( Standard Lua uses 64-bit integers and double-precision ( 64-bit) floats )。
语法结构的简单是付出空间代价换来的。
lua
print(123) -- 123
print(3.14) -- 3.14
string
string 类型用来表示文本。
使用一对匹配的单引号。
Lua 中没有字符类型,所谓的字符类型也是含有一个字符的字符串而己。
字符串还可以用一种长括号(即[[ ]]) 括起来的方式定义。其好处就在于: 1 -> 转义
并不展开(此举,跟 C++11 中 R"(hello lua)"相似) , 2 -> 便于多行书写。
Lua 中的字符串没有[]下标的概念。
=\[ \]=\]等号两侧不可以用空格,主要起到层级/配对的作用。
```lua
print("Hello, world!") -- Hello, world!
print('Hello, world!') -- Hello, world!
print([[Hello,
world!]]) -- Hello, world!
print("Hello" .. "world!") -- Helloworld!
print("Hello" .. " " .. "world!") -- Hello world!
```
## function
函数,在 Lua 中也是一种数据类型
function 类型用来表示函数。
函数可以存储在变量中,可以通过作参数传递给其他函数,还可以作为其他函数的返
回值。其上行为同普通变量无异
```lua
function add(a, b)
return a + b
end
print(add(1, 2)) -- 3
```
有名函数的定义本质上是:匿名函数对变量的赋值。为说明这一点,其如下写法也是
合法的。
```lua
function foo()
end
等价于
foo = function ()
end
类似的
local function foo()
end
等价于
local foo = function ()
end
```
函数入参无类型/返值无限制
```lua
function hello(a, b)
print("a:", type(a), "b:", type(b))
print(a, b)
return 1, 2, 3, 4, 5
end
```
## userdata
userdata 类型用来表示用户数据。
```lua
-- 创建一个 userdata
local obj = {}
-- 给 userdata 设置元表
setmetatable(obj, {
__add = function(a, b)
return a.value + b.value
end
})
-- 设置 userdata 的值
obj.value = 10
-- 调用 userdata 的元方法
print(obj + obj) -- 20
```
## thread
thread 类型用来表示线程。
```lua
-- 创建一个线程
local thread = coroutine.create(function()
for i = 1, 10 do
print(i)
coroutine.yield()
end
end)
-- 启动线程
coroutine.resume(thread)
-- 等待线程结束
coroutine.status(thread) -- dead
```
## table
Table 类型中一种基于 k-v 类型,实现了一种抽象的 "map\