如何使用冒号(:)传递Lua中的self参数?
如何使用冒号(:)传递self变量?
在Lua中,冒号调用的语法obj:method()是一种语法糖,等价于obj.method(obj)——它会自动把调用的对象作为第一个参数(也就是self)传递给方法。但这种语法仅支持标识符形式的方法名(比如func、calc这类由字母/下划线开头的名称),不支持直接跟方括号的索引表达式,所以你写的entity:[2]()不符合Lua的语法规则,会报错。
解决方法
方法1:将函数放到命名键下(推荐)
如果可以调整table的结构,把函数赋值给一个命名的键,就能正常使用冒号调用:
entity = { 77, x = 2, y = 4, -- 给函数命名一个标识符键 print_sum = function(self) print(self.x + self.y) end } entity:print_sum() -- 输出6,等价于entity.print_sum(entity)
方法2:保留数字索引时的替代方案
如果必须保留数字索引的函数,无法直接用冒号语法,但可以手动模拟冒号的效果——也就是显式传递self参数,这也是你最开始的可行写法:
entity = {77, function(self) print(self.x+self.y) end, x=2,y=4} entity[2](entity) -- 输出6
如果非要用类似冒号的写法,也可以通过先获取函数再调用的方式(本质还是显式传参):
local func = entity[2] func(entity) -- 同样输出6
内容的提问来源于stack exchange,提问作者Rianma Febrio
相关产品推荐
相关产品推荐

