Lua基础

1. 简介

Lua 是一种轻量、小巧的脚本语言,用标准C语言编写并以源代码形式开放。Lua 的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它的源代码包含大约30000行C语言代码,编译后的大小仅有一百余K,非常便于嵌入其他程序中。

Lua 支持多种编程范式,包括过程式编程、面向对象编程、函数式编程、数据驱动编程和数据描述。此外,Lua 提供了非常易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,Lua 可以像使用内置功能一样使用它们。

Lua 最初由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的一个研究小组于1993年开发,该小组成员包括Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo。Lua 的名称在西班牙语中意为“月亮”,这个名称并非缩写,而是一个名词。

Lua 的应用场景非常广泛,包括游戏开发、独立应用脚本、Web应用脚本、扩展和数据库插件(如MySQL Proxy和MySQL WorkBench),以及安全系统(如入侵检测系统)等。

总的来说,Lua 是一种功能强大但简单易用的脚本语言,适用于各种需要灵活扩展和定制功能的应用程序。

2. 基础


-- --------------------------------------
-- 单行注释
print("Hello world!")

--[[
多行注释,若注释中有table则容易混淆
--]]

--[=[
有时候也采用这种方式来进行多行注释
--]=]

a = 10
print(a)
print(a*1.1)
a = nil -- 赋值nil,相当于删除了a
print(a)
print(b) -- 未赋值,默认就是nil

-- --------------------------------------
-- type的用法
print(type("aaa"))
print(type(10.2*3))
print(type(print))
print(type(false))
print(type(nil))

-- ---------------------------------------
-- 单行字符串,使用单or双引号
-- 多行字符串,(一块字符串)如下
html = [[
<html>
<head>HTML TEST</head>
<body>
	<a href="http://www.baidu.com/">百度一下,你就知道</a>
</body>
</html>
]]
print(html)

-- 注意:和其他语言不同的地方
print('21' + 6)	-- 其中会将字符串'21'当作数字21来进行计算
print("123".."abc")
print(type(123 .. 456)) -- 字符串的连接是采用 .. 的

-- 使用 # 来计算字符串的长度
print("字符串的长度为:", #"123abcd")


--[=[
-------------------------------------------------
			表table 的相关用法示例
Lua中的table本质上是个“关联数组”
table[key]

若key为字符串,则也可以采用如下方式进行调用
table.key

-------------------------------------------------
--]=]

-- 空表
local tbl1 = {}
print(tbl1)

-- 直接初始化表
local tbl2 = {"apple","pear","orange"}
print(tbl2)
for k,v in pairs(tbl2) do
	-- 此时注意:和其他语言不同的地方是Lua表中的索引是从1开始的
	print(k..":"..v)
end
print("------------------------")


-- 表是变长的(非固定长度)
-- 同时,参杂一下函数的用法
function display(tbl)
	for k,v in pairs(tbl) do
		print(k..":"..v)
	end
	print("------------------------")
end

a = {}
for i = 1,10 do
	a[i] = i * 10
end
display(a)

-- 可以通过匿名函数的方式传递参数
function display_lambda(tbl,fun)
	for k,v in pairs(tbl) do
		print(fun(k,v))
	end
	print("------------------------")
end
display_lambda(a,
function(key,value)
	return key..":"..value;
end
);


--[=[
-------------------------------------------------
	变量
- Lua默认都是全局,即便是在函数内部。
- 除非你使用关键字local来声明

尽量多使用local变量:
1. 避免命名冲突
2. 访问速度比全局的快
-------------------------------------------------
--]=]
a = 1
b = 2
print(a,b)
a,b = b,a -- 交换
print(a,b)


-- 多变量同时赋值操作
a,b,c = 4,5
print(a,b,c) -- 不足的value用nil补齐
a,b,c = 6,7,8,9
print(a,b,c) -- 多余的value将被忽略

3. 循环


-- while循环
a = 10
while( a ~= 0) -- 不等号注意下:~=
do
	-- 在循环中我就顺便把if语言也说了
	if(a%2 == 0)
	then
		print("a="..a)
	end
	a = a - 1
end
print("---------------------------")

-- for循环(数值) 见下
-- for循环(泛型) 见table相关说明
for i = 10,1,-1 do
	print("i="..i)
	-- 在循环中我就顺便把if语言也说了
	if(i%2 == 0)
	then
		print("偶数")
	else
		print("奇数")
	end
end
print("---------------------------")

-- repeat循环
a = 10
repeat
	print("a="..a)
	-- 在循环中我就顺便把if语言也说了
	if(a == 2)
	then
		print("2222222")
	elseif(a == 5)
	then
		print("5555555")
	else
		print("???")
	end
	a = a - 1
until a == 0

4. 函数


function max(num1,num2)
	-- 函数基础
	if num1 > num2 then
		return num1
	else
		return num2
	end
end
print(max(3,5))
print("---------------------------")

function maxmum(tbl)
	-- 多返回值函数
	local index = 1
	local value = tbl[index]
	for k,v in pairs(tbl) do
		if v > value then
			index = k
			value = v
		end
	end
	return index,value
end
print(maxmum({11,13,15,16,12}))
print("---------------------------")

function average(...)
	local result = 0
	-- arg为一个表,局部变量
	local arg={...}
	for k,v in ipairs(arg) do
		result = result + v
	end
	-- select("#",...) 返回可变参数的长度
	-- select(n,...) 用于访问n到select("#",...)的参数
	print("数据个数:"..select("#",...))
	return result/#arg
end
print("求均值:"..average(1,2,3,4,5,6,7,8,9,10))
print("---------------------------")

5. 运算符


--[=[
-----------------------------------------
	算术运算符
--]=]
print(2/3) -- 相当于double除法
print(2^3) -- 幂


--[=[
-----------------------------------------
	关系运算符
--]=]
print(3 ~= 5) -- 特殊: Lua中~=表示不等于


--[=[
-----------------------------------------
	逻辑运算符
and,or,not
--]=]


--[=[
-----------------------------------------
	其他运算符
.. 连接两字符串
# 一元运算符,返回字符串或表的长度
--]=]

6. 字符串


str = "Hello world! I am Bruce. "
print(string.upper(str))
print(string.lower(str))
print(string.gsub(str,"Bruce","Bluce"))
print(string.find(str,"world"))
print(string.reverse(str))
print(string.format("字符串:%s",str))
print(string.len(str))
print(string.rep(str,2))  -- 重复

--[=[
	匹配模式详细参数
可以参考:https://www.runoob.com/lua/lua-strings.html
--]=]
print(string.match(str,"o")) -- 寻找匹配1
print(string.match(str,"%a+! %a+")) -- 寻找匹配2

print(string.char(0x61,0x62,0x63)) -- 将整型转为字符并连接
print(string.char(97,98,99))
print(string.byte("abc")) -- 转换字符为整型,默认返回第一个
print(string.byte("abc",3)) -- 指定返回第三个字符的整型值

-- 迭代器
for word in string.gmatch(str, "%a+") do 
	print(word)
end

7. 数组


str = "Hello world! I am Bruce. "
print(string.upper(str))
print(string.lower(str))
print(string.gsub(str,"Bruce","Bluce"))
print(string.find(str,"world"))
print(string.reverse(str))
print(string.format("字符串:%s",str))
print(string.len(str))
print(string.rep(str,2))  -- 重复

--[=[
	匹配模式详细参数
可以参考:https://www.runoob.com/lua/lua-strings.html
--]=]
print(string.match(str,"o")) -- 寻找匹配1
print(string.match(str,"%a+! %a+")) -- 寻找匹配2

print(string.char(0x61,0x62,0x63)) -- 将整型转为字符并连接
print(string.char(97,98,99))
print(string.byte("abc")) -- 转换字符为整型,默认返回第一个
print(string.byte("abc",3)) -- 指定返回第三个字符的整型值

-- 迭代器
for word in string.gmatch(str, "%a+") do 
	print(word)
end

8. 迭代器


--[=[------------------------------------------------
	泛型 for 迭代器
--]=]
tbl = {"apple","orange","banana","watermelon"}
for k,v in ipairs(tbl)
do
	print(k,v)
end

--[=[------------------------------------------------
	无状态迭代器
--]=]
function power(iterator_max_count,current_number)
	if current_number < iterator_max_count
	then
		current_number = current_number + 1
		return current_number,current_number*current_number
	end
end

for i,n in power,5,0
do
	print(i,n)
end

9. 表

tbl = {"d","a","e","b","c"}
-- 参数都是顺序可选的
-- 第一个参数是指定分隔符
-- 第二个参数是start
-- 第三个参数是end
print(table.concat(tbl,"-",2,4))
table.insert(tbl,1,":")
print(table.concat(tbl))
table.remove(tbl,1)
print(table.concat(tbl))
table.sort(tbl)
print(table.concat(tbl))

10. 模块

模块代码示例如下:

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}

-- 定义一个常量
module.constant = 10

-- 定义一个函数
function module.display_table(tbl)
	for k,v in pairs(tbl)
	do
		print(k,v)
		-- io.write(k,v)
	end
end

-- 注意:这样定义,则是个全局的
-- 除非添加local关键字,才能变为该module私有的
function display_table(tbl)
	for k,v in pairs(tbl)
	do
		print(k,v)
		-- io.write(k,v)
	end
end

return module

调用模块代码示例如下:

--[=[----------------------------------------
	加载模块的方式1
--]=]
require("module")

print(module.constant)
a = {"a","b","c"}
-- display_table(a)  -- 测试全局的
module.display_table(a) -- 测试模块的

--[=[----------------------------------------
	加载模块的方式2
--]=]
m = require("module")
print(m.constant)