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)