Lua 基本语法学习笔记(五)

本文介绍了Lua中的面向对象编程概念,包括封装、继承和多态,并展示了具体的实现示例。同时,详细讨论了Lua的垃圾回收机制,包括增量标记-扫描收集器的工作原理以及如何通过`collectgarbage`函数进行手动干预。此外,还演示了如何通过`collectgarbage`函数监控和控制内存管理。
摘要由CSDN通过智能技术生成

面向对象

  • 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
  • 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
  • 3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
Object = {}
function Object:new()
    local obj = {}
    -- 给空对象设置元表
    self.__index = self
    setmetatable(obj, self)
    return obj
end

function Object:subClass(className)
    -- 根据名字生成一张表,也就是一个类
    _G[className] = {}

    local obj = _G[className]
    -- 设置自己的父类
    obj.base = self
    self.__index = self
    setmetatable(obj, self)
end
--一个新的类
Object:subClass("GameObject")
GameObject.x=0
GameObject.y=0
function GameObject:move()
    self.x=self.x+1
    self.y=self.y+1
end


local obj = GameObject:new()
print(obj.x)
obj:move()
print(obj.x)
local obj2 = GameObject:new()
print(obj2.x)
obj2:move()
print(obj2.x)

GameObject:subClass("Player")

function Player:move()
    --调用父类方法
    self.base.move(self)
end

local p1 = Player:new()
print("====p1=====")
print(p1.x)
p1:move()
print(p1.x)

local p2 = Player:new()
print("====p2=====")
print(p2.x)
p2:move()
print(p2.x)

常用第三方库

print("=========自带库==========")
print("============时间=============")
--系统时间
print(os.time())
--自己查询的时间
print(os.time({year=2014,month=8,day=4}))
local nowTime = os.date("*t")
print(nowTime)
for k, v in pairs(nowTime) do
    print(k,v)
end
print(nowTime.hour)
print("============数学运算============")
--绝对值
print(math.abs(-4))
--随机数种子
math.randomseed(os.time())
print(math.random(100))
print(math.random(100))
print("==============路径===========")
--lua加载的路径
print(package.path)

垃圾回收

Lua 采用了自动内存管理。 这意味着你不用操心新创建的对象需要的内存如何分配出来, 也不用考虑在对象不再被使用后怎样释放它们所占用的内存。

Lua 运行了一个垃圾收集器来收集所有死对象 (即在 Lua 中不可能再访问到的对象)来完成自动内存管理的工作。 Lua 中所有用到的内存,如:字符串、表、用户数据、函数、线程、 内部结构等,都服从自动管理。

Lua 实现了一个增量标记-扫描收集器。 它使用这两个数字来控制垃圾收集循环: 垃圾收集器间歇率和垃圾收集器步进倍率。 这两个数字都使用百分数为单位 (例如:值 100 在内部表示 1 )。

垃圾收集器间歇率控制着收集器需要在开启新的循环前要等待多久。 增大这个值会减少收集器的积极性。 当这个值比 100 小的时候,收集器在开启新的循环前不会有等待。 设置这个值为 200 就会让收集器等到总内存使用量达到 之前的两倍时才开始新的循环。

垃圾收集器步进倍率控制着收集器运作速度相对于内存分配速度的倍率。 增大这个值不仅会让收集器更加积极,还会增加每个增量步骤的长度。 不要把这个值设得小于 100 , 那样的话收集器就工作的太慢了以至于永远都干不完一个循环。 默认值是 200 ,这表示收集器以内存分配的"两倍"速工作。

如果你把步进倍率设为一个非常大的数字 (比你的程序可能用到的字节数还大 10% ), 收集器的行为就像一个 stop-the-world 收集器。 接着你若把间歇率设为 200 , 收集器的行为就和过去的 Lua 版本一样了: 每次 Lua 使用的内存翻倍时,就做一次完整的收集。

  • collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:

  • collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。

  • collectgarbage("restart"): 重启垃圾收集器的自动运行。

  • collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。

  • collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。

  • collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。

  • collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。

print("==============垃圾回收==============")
test={id=1,name="11"}
--获取当前lua占用内存数 K字节
print(collectgarbage("count"))
test=nil
collectgarbage("collect")
print(collectgarbage("count"))
--lua中有自动定时进行GC的方法,但是消耗性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值