文章

Lua

Lua的一些知识...

Lua

Lua

注释(–)

1
2
3
4
5
6
-- 单行注释
--[[
多行注释
多行注释
--]]

数据类型

  • nil:无效值(false)
1
2
3
4
5
--nil作比较时应加上“”
local a
if a=="nil"
    then
end 
  • boolean:使用 or 或者and 、not进行计算,除false和nil都为true
  • number:表示双精度类型的实浮点数
  • string:字符串由一对双引号或单引号来表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。
local string=[[
41341
aff4
42
asfasf
]]
--在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:
local a='12'
local b="20"
print(a+b)--32
--string链接使用..
a,b="nihao","hellp"
print(a..b)--nihaohello
--使用 # 来计算字符串的长度
print(#a)--5
  • userdata:表示任意存储在变量中的C数据结构
  • function:函数
  • thread:表示执行的独立线路,用于执行协同程序
  • table:表,可以用来存储任意类型的数据。其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。

变量

  • 使用前需声明,但不需要类型定义
  • 默认值为nil
  • 类型:

全局变量

局部变量:作用域为从声明位置开始到所在语句块结束。

表中的域

  • 在函数中除非用local声明,否则都为全局变量

赋值

可以为多个变量同时赋值

1
2
3
4
5
6
local a,b=1,2
--[[
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略
a. 变量个数 > 值的个数             按变量个数补足nil
b. 变量个数 < 值的个数             多余的值会被忽略
]]--

赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以可以这样进行交换变量的值:

1
2
local a,b=1,2
a,b=b,a--交换ab的值

索引

  • lua中索引从1开始
1
2
3
4
t={}
i=0
a= t[i]
b=t.i                 -- 当索引为字符串类型时的一种简化写法

循环

循环类型

  • while 循环
  • for 循环
  • repeat until

控制语句

  • break
  • goto

条件语句(if)

1
2
3
4
if(0)--注意lua中0为true
    then--用来标志前面的条件判断结束 
    --执行语句
end 

函数(function)

1
2
3
4
5
--不必声明返回类型
function function1()
    --执行语句
    return 2,20,20--Lua语言函数可以返回多个值,每个值以逗号隔开。
end

Lua 中我们可以将函数作为参数传递给函数

1
2
3
4
5
6
7
8
9
function function2(str)
    print(str.."请说")
end

function function3(str,c)
    c(str)
end
function3("nihao",function2)

Lua 函数可以接受可变数目的参数,在函数参数列表中使用三点 … 表示函数有可变的参数。

通过 select(“#”,…) 来获取可变参数的数量

select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。

1
2
3
4
5
6
7
function function4(...)
    local table_1={...}--将传入参数接受为一个table
    --执行语句
    
    num1=select("#",...)--通过 select("#",...) 来获取可变参数的数量
    table2=select(2,...)--select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。
end

几个固定参数加上可变参数,固定参数必须放在变长参数之前

1
2
3
function function5(a,b,...)
    
end

运算符

  • ~= :不等于
  • # :表示返回表或者字符串的长度
  • .. :链接字符串
  • \^ :乘幂
  • \\ :整除
  • 优先级

./Pic/img.png

-(unary)表示负号

字符串操作

长度获取

使用 string.len函数或 utf8.len 函数,包含中文的一般用 utf8.len,string.len 函数用于计算只包含 ASCII 字符串的长度。

截取

string.sub(s, i [, j])

  • s:要截取的字符串。
  • i:截取开始位置。
  • j:截取结束位置,默认为 -1,最后一个字符。
1
2
local a="41631531"
b=string.sub(a,-10)--截取后十个字符串

大小写转换

  • string.upper(string1)
  • string.lower(string1)

常用字符串方法

./Pic/img_1.png ./Pic/img_2.png ./Pic/img_3.png

字符与整数互转

./Pic/img_5.png

./Pic/img_9.png ./Pic/img_10.png

迭代器

1
2
3
4
5
6
7
8
local a={1313,11,123,13,14}
-- key 表示索引,value 表示当前索引位置上的值
for key,value in pairs(a) 
    do
    print(key,value)
end 
--注意for i, v in ipairs(t) do,遇见nil就停止迭代

执行过程

1
2
3
4
5
6
7
8
9
10
11
function Xunhuan(max,result)
    result=result+1
    if result<=max then
        return result,result^result
    end
end

for i,n in Xunhuan,5,0
    do
    print(i,n);
end 
  • 计算in后面的方法
  • 将 返回值赋予i,n
  • 将 i作为第个参数传入in后面的方法
  • 将返回值赋予i,n
  • 。。。。。。。
  • 直到返回nil

table

  • 如果没有对象存储table的内存地址,则系统将会回收该table

常用table方法

./Pic/img_4.png

1
2
3
4
5
6
7
8
9
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))

-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))

-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))

当获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。

可以使用以下方法来代替:

1
2
3
4
5
6
7
function table_leng(t)
    local leng=0
    for k, v in pairs(t) do
        leng=leng+1
    end
    return leng;
end

元表

类似给table加上拓展方法

场景元方法示例
两表相加__add{1,2} + {3}
访问不存在的键__indext.xx 不存在
给不存在的键赋值__newindext.x = 1x 不存在
字符串拼接__concat"a" .. t
相等比较__eqt1 == t2
小于比较__ltt1 < t2
垃圾回收前回调__gc释放资源
把表当函数调用__callt()

./Pic/img_5.png

./Pic/img_6.png

./Pic/img_7.png

./Pic/img_8.png

本文由作者按照 CC BY 4.0 进行授权