如何在Lua中实现类似JavaScript Proxy.apply的可调用对象
在Lua中实现可调用对象(兼具函数调用与方法)
要实现既可以像函数一样调用,又能拥有自定义方法的对象,Lua中需要借助**元表(metatable)**的__call元方法——普通表本身无法直接调用,但给表绑定包含__call的元表后,就能触发函数式调用逻辑,同时表本身可以自由添加方法。
实现代码
-- 创建核心表作为可调用对象的载体 local describe = {} -- 给表添加自定义方法 function describe.skip() print("执行skip方法逻辑") end -- 定义元表,实现调用逻辑 local callable_mt = { __call = function(self, ...) -- self 指向被调用的describe表,... 接收调用时传入的所有参数 print("执行函数式调用逻辑,传入参数:", ...) -- 这里编写原本要在describe()中执行的核心代码 end } -- 为describe表绑定元表 setmetatable(describe, callable_mt) -- 两种调用方式均生效 describe("测试参数1", "测试参数2") -- 触发__call元方法,执行函数式调用 describe.skip() -- 调用表的自定义方法
关键说明
__call是Lua的元方法之一,当表被当作函数调用时(即describe()),Lua会自动查找该表的元表并执行__call方法。- 表
describe本身是标准Lua表,可自由添加任意属性或方法(比如skip),完全满足自定义需求。 - 你之前尝试直接给函数添加方法的方式不可行,因为Lua中的函数并非表,无法像表一样直接挂载自定义方法,而表+元表的方式是Lua实现这类需求的标准方案。
内容的提问来源于stack exchange,提问作者frankie
相关产品推荐
相关产品推荐

