You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua中如何将对象/表的函数保存到变量并调用?

Lua面向对象中保存对象方法到变量的正确方式

问题原因

Lua里用:定义的方法是语法糖,等价于用.定义并将调用者作为第一个参数self传入。当你通过object1.PrintString直接获取函数引用时,并没有绑定对应的对象作为self,调用时自然没有这个参数,导致self为nil报错。

解决方案

1. 手动传入self

调用保存的函数时,主动把对象作为第一个参数传入:

funct2_object1 = object1.PrintString
funct2_object1(object1) -- 正常输出 Default

2. 用匿名函数包装(推荐用于库函数传参)

如果要把方法传给第三方库(比如你提到的GUI:AddEventHandler),用匿名函数把对象和方法绑定,调用时会自动带上self:

-- 保存方法到变量
funct2_object1 = function()
    object1:PrintString()
end
funct2_object1() -- 正常输出 Default

-- 直接传给库函数的写法
GUI:AddButton(...) :AddEventHandler(event, function()
    object1:PrintString()
end)

3. 实现通用的bind函数

如果需要频繁绑定对象和方法,可以写一个通用工具函数,返回绑定了self的闭包:

function bind(obj, method)
    return function(...)
        return method(obj, ...)
    end
end

-- 使用方式
funct2_object1 = bind(object1, object1.PrintString)
funct2_object1() -- 正常输出 Default

补充说明

你之前尝试的funct2_object1 = object1:PrintString()是错误写法,因为object1:PrintString()会直接执行方法,把返回值(此处为nil)赋值给变量,自然无法调用。

内容的提问来源于stack exchange,提问作者skrovno_CZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:17:29