一、Lua简介
1、基本概念
类型与值
table
条件 if
循环 while for
包和库
2、执行速度
C : 1
Java : 1/2-1/3
JavaScriptV8 1/3-1/10
Lua: 1/30
PHP 1/30-1/100
Python 1/30-1/100
3、嵌入性
二、开发环境
Mac
$ brew install lua $ lua -v Lua 5.3.5
hello.lua
print("hello world") -- hello world for i=1, 10 do print(i) end -- 1 2 3 4 5 6 7 8 9 10
三、Lua值和类型
数值类型: 1, 1.2, 3.14
字符串类型: “hello world”
布尔类型: true false
变量赋值
a = 1 b = true print(a, b) -- 1 true
Lua的Table
Table = 数组 + 映射
下标是从1开始
没有类型限制
大小自动扩容
数组写法
写法一: a = {} a[1] = 10 a[2] = 20 a[3] = "hello" print(a[1], a[2], a[3]) -- 10 20 hello 写法二: a = { 10, 20, "hello" }
映射写法
写法一: a = {} a["hello"] = 2 a[3] = false print(a.hello, a[3]) print(a["hello"], a[3]) 写法二: a = { ["hello"] = 2, [3] = false, }
四、Lua函数
function add(a, b) return a + b end print(add(1, 2)) -- 3 -- 函数可以在变量之间赋值 add = function (a, b) return a + b end -- 返回多个值 function add(a, b) return a + b, a - b end print(add(1, 2)) -- 3 -1 -- 多变量赋值 a, b = 1, 2 print(a, b) -- 1 2 -- 变量交换 a, b = b, a print(a, b) -- 2 1 -- 左边变量多 a, b = 1 print(a, b) -- 1 nil -- 右边变量多 a, b = 1, 2, 3 print(a, b) -- 1 2
五、Lua表达式
算术表达式
a = 1 + 1 print(2) a = 1 b = 1 print((a + b) * 3) -- 没有++运算符 c = 1 c = c + 1 print(c)
逻辑表达式
true and false => false true or false => true not false => true
字符串拼接
print("hello" .. "world") -- helloworld
作用域
-- 默认为全局变量 function foo() a = 1 end foo() print(a) -- 1 -- local声明为局部变量 function foo() local a = 1 end foo() print(a) -- nil
推荐:local大法好
六、Lua流程控制
if 和 while
if condition then ... elseif condition then ... else ... end
local i = 0 while i < 10 do print(i) i = i + 1 end
for数值遍历
for i = start, end, step do ... end -- [0, 9] for i = 1, 9 do print(i) end -- 等价于c语言 for(int i = 0; i < 10; i++){ printf("%d\n", i); }
for泛型遍历
pairs 和 ipairs迭代器
-- 遍历的时候是无序的 for k, v in pairs(a) do print(k, v) end -- 100 true -- 1 20 -- foo 1 -- 2 30 -- 遍历时只搜索数组部分 for k, v in ipairs(a) do print(k, v) end -- 1 20 -- 2 30
七、Lua 包package
foo.lua
local class = {} function class.foo(a, b) return a + b end -- 等价于 -- class.foo = function (a, b) -- return a + b -- end return class
main.lua
local c = require("foo") print(c.foo(1, 2))
区别:
require 加载文件,只运行一次(最新)
dofile 加载并运行(早期)
print("require") for i = 1, 2 do print(require("demo")) end -- require -- table: 0x7fd30f600000 -- table: 0x7fd30f600000 print("dofile") for i = 1, 2 do print(dofile("demo.lua")) end -- dofile -- table: 0x7fd30f600360 -- table: 0x7fd30f6007c0
执行字符串相当于eval
lua5.3之后不支持
dostring("")
Lua系统库
-- 注释 --[[ 长注释 ]] local t = {} for i = 1, 10 do table.insert(t, 1) end for k, v in pairs(t) do print(k, v) end for k, v in pairs(table) do print(k, v) end for k, v in pairs(table) do print(k, v) end --[[ unpack move pack sort concat insert(table, value) remove(table, index) ]]
删除映射
local t = {} t.a = 1 t.b = 2 t.a = nil for k, v in pairs(t) do print(k, v) end
获取长度
local t = {1, 2, 3} print(#t) -- 3 local s = "hello world" print(#s) -- 11
类型转换
local t = “hello”
print(type(t))
tonumber(“3.14”)
tostring(3.14)
字符串格式化
string.format(“hi%d”, 2)
总结
Lua特点
Table = 数组 + 映射
数组下标从1开始,数组连续使用否则是映射,自动扩展
Lua函数
万物皆值,函数也是一种值
函数支持多个返回值
Lua表达式
逻辑运算 and or not
字符串连接 …
local大法好 代码优化,作用域控制
Lua迭代器遍历
数组遍历 for k, v in ipairs(t) do…end
Table遍历 for k, v in pairs(t) do…end