面相对象编程
table, 所以需要实现class,需要用table来描述对象的属性 or 功能
如果在 lua 需要让当前类能够像对象一样去访问类中成员,很多功能都需要使用元表来实现
案例
self的用法
mytable = {} -- 定义类
mytable.a = 1 -- 成员变量
function mytable.testfunc(x)
print(x)
end
function mytable:testfunc2(x)
self.a = self.a + x
print(self.a)
end
-- 实例化对象
mt1 = mytable
-- 对象名调用类成员
mt1.testfunc(100)
mt1:testfunc2(10)
-- 如果当前类中的函数 需要使用self,那么当前函数的定义以及调用都必须使用冒号;
类中的构造
class1 = {
x = 0,
y = 0,
z = 0
}
class1.__index = class1
function class1:new(x, y)
local t = {}
t.x = x
t.y = y
t.z = x + y
setmetatable(t, class1)
return t
end
function class1:printz()
print('x 与 y 的和', self.z)
end
-- 实例化
r1 = class1:new(2,3)
r2 = class1:new(5,3)
print(r1.z, r2.z)
r1:printz()
继承和多态
ball = {
name = '',
price = 0,
size = 0
}
ball.__index = ball
function ball:new(name, price, size)
local t = {}
t.name = name
t.price = price
t.size = size
setmetatable(t, ball)
return t
end
function ball:play()
print("玩球")
end
b1 = ball:new("球1", 120, 5)
print(b1.name)
print(b1.price)
print(b1.size)
b1:play()
require 'Lua-old.003'
-- 子类
basketball = {
color = ''
}
setmetatable(basketball, ball)
basketball.__index = basketball
function basketball:new(name, price, size, color)
local t = {}
t = ball:new(name, price, size)
t.color = color
setmetatable(t, basketball)
return t
end
-- 子类自身延展新的方法
function basketball:go()
self.price = self.price + 1
end
function basketball:play()
print('玩篮球')
end
b3 = basketball:new("篮球", 300, 30, '红色')
print(b3.price)
b3:go()
print(b3.price)
b3:play()
断点报错机制
local t = {
x = 1,
y = 2
}
-- 判断 第一个 i 条件是否满足, 如果第一个条件不满足, 那么就会以报错的方式提示
-- 如果第一个条件满足,assert 返回 true
local a, b = assert(t ~= nil, "我错了")
print(a, b)
assert(s ~= nil, "s 为 nil")
Lua函数
旧版 Lua:loadstring(str)
加载运行一个字符串,把字符串内容当作是 lua 语法来执行
loadstring("print(123)")() -- 123
新版 Lua:load
local code = "a = function() return 2022 end return a"
local chunk, err = load(code)
if chunk then
c = chunk()
print(c())
else
print('Error:', err)
end
dofile(filename)
001.lua中
print("这是001Lua")
return 1
c = dofile("Lua-old/001.lua")
print(c)
rawequal 相等 rawget 获取 rawset 赋值
mytable1 = {
'123',
x = 5
}
print(mytable1[1]) -- 123
print(mytable1['x']) -- 5
str = '123'
num = 123
print(rawequal(mytable1, str)) -- false
print(rawequal(mytable1[1], str)) -- true
print(rawequal(num, str)) -- false
-- 根据键 赋值
rawset(mytable1, 1, 999)
rawset(mytable1, 'y', "dfdf")
print(rawget(mytable1, 1)) -- 999
print(rawget(mytable1, 'y')) -- dfdf
mytable2 = {'mytable2'}
rawset(mytable1, mytable2, 'game')
print(rawget(mytable1, mytable2)) -- game
print(mytable1[mytable2]) -- game
tonumber(e, base)
把参数转换为十进制数, base 表示基数
print(tonumber(100)) -- 100
print(tonumber('100')) -- 100
print(tonumber('100', 2)) -- 4
tostring(e)
转换为字符串类型
mytable1 = {'table1'}
print(mytable1) -- table: 00000000006da110
print(type(tostring(mytable1))) -- string
print(tostring(123))
print(tostring(type)) -- function: 0000000065b9ca10
print(type(tostring(type))) -- string
string 标准库
x = 'aaa'
y = 'bbb'
z = [[]abcdefg[]]
print(x, y, z)
print(string.upper('abc')) -- ABC
print(string.lower('12abCDEF')) -- 12abcdef
print(string.find("C:/Test1/myTest", "myTest")) -- 10 15
print(string.reverse("abc")) -- cba
print(string.len("Hello")) -- 5
print(#"Hello world") -- 11
print(string.byte('a')) -- 97
print(string.sub('startpanel', 6, 10)) -- panel 截取字符串
print(string.gsub('hongfei', 'n', 2)) -- ho2gfei 1 替换次数
print(string.format('%.2f', 3.232323454)) -- 3.23
print(string.format('%x %o', 15, 8)) -- f 10
I/O 库,输入输出流,Lua I/O 库 用于读取和处理文件
open(file, mode)
- r :只读 的模式打开, 这也是对已存在的文件默认的打开方式
- w :只写的模式打开,允许修改已经存在的文件和创建新文件
- a :追加的模式打开,对已经存在的文件追加新的内容
- r+ :读写模式打开已有文件
- w+ :如果文件已存在,删除文件中的数据,如果文件不存在 则新建文件,读写模式打开
- a+ :已可读的追加模式打开 已经存在的文件,若文件不存在则新建文件
local file = io.open("Lua-old/1.txt", "a+")
file:write("abc")
file:close()
local file2 = io.open("Lua-old/1.txt", "r+")
print(file2:read())
file2:close()
Lua自动内存管理和垃圾回收
collectgarbage(‘collect’) 显示的回收函数
collectgarbage(‘count’) Lua 内存使用监听
function text()
local c = collectgarbage("count") * 1024
print("before ======>" .. c)
local table1 = {} -- 局部变量
for i = 0, 2000 do
table1[i] = i
end
local c2 = collectgarbage("count") * 1024
print("after =======>" .. c2)
end
text()
collectgarbage("collect")
local c3 = collectgarbage("count") * 1024
print("after =======>" .. c3)
利用以上方式,监听Lua内存的使用情况,杜绝内存泄露的情况发生:
- 争对大量的代码逻辑块,先调用collectgarbage(‘count’) 取得初始内存
- 代码执行后,再调用collectgarbage(‘collect’) 进行垃圾回收
- 在通过 collectgarbage(‘count’) 获取内存,比较内存使用差