Lua高阶内容

面相对象编程

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’) 获取内存,比较内存使用差
上一篇
下一篇