Lua表内函数的Up-value问题:如何实现无该问题的功能?
解决Lua中Up-value提示问题的几种方案
你的代码里IDE提示Up-value问题,是因为内部匿名函数捕获了外部函数createTable的value参数。这在Lua里是合法的闭包用法,但如果要规避这个提示,可以试试下面几种方法:
方案1:将value存入表字段,通过self访问
把value存在表的一个字段里,让内部函数通过访问表自身的字段来获取值,避免直接捕获外部参数:
function createTable(value) local myTable = { -- 必须加local,避免污染全局变量 name = 'Table', args = { time = 0, storedValue = value, -- 把value存进表内 score = { function(self) return self.storedValue / 2 end }, }, } return myTable end -- 调用示例: local tbl = createTable(10) print(tbl.args.score[1](tbl.args)) -- 输出5
方案2:立即执行函数封装value
通过一个立即执行的匿名函数,把value作为参数传递进去,让内部函数捕获这个内层函数的局部变量,部分IDE不会再提示Up-value:
function createTable(value) local myTable = { name = 'Table', args = { time = 0, score = { -- 立即执行函数接收value,返回绑定了该值的闭包 (function(v) return function() return v / 2 end end)(value) }, }, } return myTable end -- 调用示例: local tbl = createTable(10) print(tbl.args.score[1]()) -- 输出5
方案3:直接存储计算结果(如果不需要动态执行)
如果score里的函数不需要动态计算(比如value在创建表时就固定,后续不需要改变),可以直接把计算结果存在表里,完全不用函数:
function createTable(value) local myTable = { name = 'Table', args = { time = 0, score = { value / 2 }, -- 直接存计算好的值 }, } return myTable end -- 调用示例: local tbl = createTable(10) print(tbl.args.score[1]) -- 输出5
另外提醒下:原代码里的myTable没有加local,会变成全局变量,每次调用createTable都会覆盖这个全局变量,建议加上local避免意外问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

