用lua实现一个委托机制

文章目录

  • 前言
  • 一、委托机制的概念
  • 二、代码结构和原理
    • 2.1 Delegate类的定义
    • 2.2 new方法:创建委托实例
    • 2.3 add方法:添加监听函数
    • 2.4 remove方法:移除监听函数
    • 2.5 invoke方法:触发委托事件
    • 2.6 clear方法:清空所有监听函数
  • 三、测试代码的运行逻辑
    • 3.1 添加监听函数
    • 3.2 触发委托事件
    • 3.3 移除监听函数
    • 3.4 再次触发委托事件
  • 四、原理总结
  • 五、扩展和优化
    • 2.读入数据
  • 总结


前言

在Lua中实现委托机制可以通过使用表(table)和函数来模拟。委托机制通常用于事件驱动编程,允许对象将某些操作委托给其他对象或函数。以下是一个简单的委托机制实现示例:


一、委托机制的概念

委托机制是一种设计模式,用于将某些操作或事件的处理委托给其他对象或函数。它通常用于事件驱动编程,允许对象在某个事件发生时通知其他对象或执行特定的回调函数。这种机制在游戏开发、图形界面编程和异步编程中非常常见。

在Lua中,委托机制可以通过表(table)和函数来实现。表用于存储委托的监听函数,而函数用于管理这些监听函数的添加、移除和触发。

二、代码结构和原理

2.1 Delegate类的定义

Delegate = {}

这里定义了一个全局的Delegate表,它将作为委托类的原型。

2.2 new方法:创建委托实例

function Delegate:new()
    local instance = {
        listeners = {} -- 用于存储委托的监听函数
    }
    setmetatable(instance, self)
    self.__index = self
    return instance
end

2.3 add方法:添加监听函数

function Delegate:add(listener)
    if type(listener) == "function" then
        table.insert(self.listeners, listener)
    else
        error("Listener must be a function")
    end
end
  • 功能:将一个函数添加到listeners表中。
  • 检查:通过type(listener) == "function"确保传入的监听器是一个函数。
  • 存储:使用table.insert将监听函数添加到listeners表的末尾。

2.4 remove方法:移除监听函数

function Delegate:remove(listener)
    for i, v in ipairs(self.listeners) do
        if v == listener then
            table.remove(self.listeners, i)
            return
        end
    end
    print("Listener not found")
end
  • 功能:从listeners表中移除指定的监听函数。
  • 查找:使用ipairs遍历listeners表,找到与传入的监听函数匹配的条目。
  • 移除:使用table.remove从表中移除该监听函数。
  • 未找到处理:如果未找到匹配的监听函数,打印提示信息。

2.5 invoke方法:触发委托事件

function Delegate:invoke(...)
    for _, listener in ipairs(self.listeners) do
        listener(...)
    end
end
  • 功能:触发委托事件,调用所有注册的监听函数。
  • 遍历:使用ipairs遍历listeners表。
  • 调用:通过listener(…)调用每个监听函数,并将所有参数传递给监听函数。

2.6 clear方法:清空所有监听函数

function Delegate:clear()
    self.listeners = {}
end
  • 功能:清空listeners表,移除所有注册的监听函数。

三、测试代码的运行逻辑

在测试代码中,我们创建了一个委托实例myDelegate,并定义了两个监听函数listener1和listener2。

-- 定义一些监听函数
local function listener1(arg)
    print("Listener 1 received:", arg)
end

local function listener2(arg)
    print("Listener 2 received:", arg)
end

-- 测试委托机制
-- 创建一个委托实例
local myDelegate = Delegate:new()

3.1 添加监听函数

myDelegate:add(listener1)
myDelegate:add(listener2)
  • 将listener1和listener2添加到myDelegate的listeners表中。

3.2 触发委托事件

myDelegate:invoke("Hello, World!")
  • 调用invoke方法,依次执行listeners表中的所有监听函数。
  • 输出:
Listener 1 received: Hello, World!
Listener 2 received: Hello, World!

3.3 移除监听函数

myDelegate:remove(listener1)
  • 从listeners表中移除listener1。

3.4 再次触发委托事件

myDelegate:invoke("Hello again!")
  • 只有listener2被调用,因为listener1已被移除。
  • 输出:
Listener 2 received: Hello again!

四、原理总结

这个委托机制的核心是通过表(listeners)存储监听函数,并通过方法(add、remove、invoke)管理这些监听函数。其工作原理如下:

  1. 添加监听函数:将函数存储到listeners表中。
  2. 触发委托事件:遍历listeners表,依次调用每个监听函数。
  3. 移除监听函数:从listeners表中移除指定的函数。
  4. 清空监听函数:清空listeners表。

五、扩展和优化

这个委托机制是一个简单的实现,可以根据需要进行扩展和优化。例如:

  • 支持多参数传递:invoke方法已经支持通过…传递任意参数。
  • 事件优先级:可以通过对listeners表进行排序来支持优先级。
  • 事件类型:可以扩展为支持多种事件类型,每个事件类型对应一个独立的listeners表。

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(lua,lua)