当前位置: 代码迷 >> 综合 >> Lua快速入门
  详细解决方案

Lua快速入门

热度:104   发布时间:2023-09-05 19:40:20.0

可参考的教程:
https://www.runoob.com/lua/lua-tutorial.html

一、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、嵌入性

二、开发环境

http://www.lua.org/

Mac

$ brew install lua$ lua -v
Lua 5.3.5

hello.lua

print("hello world")
-- hello worldfor i=1, 10 doprint(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] = falseprint(a.hello, a[3])
print(a["hello"], a[3])写法二:
a = {["hello"] = 2,[3] = false,
}

四、Lua函数

function add(a, b)return a + b
endprint(add(1, 2))
-- 3-- 函数可以在变量之间赋值
add = function (a, b)return a + b
end-- 返回多个值
function add(a, b)return a + b, a - b
endprint(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
endfoo()
print(a)
-- 1-- local声明为局部变量
function foo()local a = 1
endfoo()
print(a)
-- nil

推荐:local大法好

六、Lua流程控制

if 和 while

if condition then...
elseif condition then...
else...
end
local i = 0while i < 10 doprint(i)i = i + 1
end

for数值遍历

for i = start, end, step do...
end-- [0, 9]
for i = 1, 9 doprint(i)
end-- 等价于c语言
for(int i = 0; i < 10; i++){printf("%d\n", i);
}

for泛型遍历

pairs 和 ipairs迭代器

数组|映射
a = {["foo"] = 1,[100] = true,[1] = 20,[2] = 30
}-- 遍历的时候是无序的
for k, v in pairs(a) doprint(k, v)
end
-- 100 true
-- 1   20
-- foo 1
-- 2   30-- 遍历时只搜索数组部分
for k, v in ipairs(a) doprint(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
-- endreturn class

main.lua

local c = require("foo")print(c.foo(1, 2))

区别:
require 加载文件,只运行一次(最新)
dofile 加载并运行(早期)

print("require")
for i = 1, 2 doprint(require("demo"))
end-- require
-- table: 0x7fd30f600000
-- table: 0x7fd30f600000print("dofile")
for i = 1, 2 doprint(dofile("demo.lua"))
end-- dofile
-- table: 0x7fd30f600360
-- table: 0x7fd30f6007c0

执行字符串相当于eval
lua5.3之后不支持
dostring("")

Lua系统库

-- 注释
--[[长注释
]]local t = {}
for i = 1, 10 dotable.insert(t, 1)
endfor k, v in pairs(t) doprint(k, v)
endfor k, v in pairs(table) doprint(k, v)
endfor k, v in pairs(table) doprint(k, v)
end
--[[
unpack
move
pack  
sort  
concat
insert(table, value)
remove(table, index)
]]

删除映射

local t = {}t.a = 1
t.b = 2
t.a = nilfor k, v in pairs(t) doprint(k, v)
end

获取长度

local t = {1, 2, 3}
print(#t)
-- 3local 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

  相关解决方案