如何将功能定义到lua的表中?我尝试使用此代码但不起作用。
我想使用table:myfunc()
。
local myfunc
myfunc = function(t)
local sum = 0
for _, n in ipairs(t) do
sum = sum + n
end
return sum
end
mytable = {
1,2,3,4,5,6,7,8,9
}
print(myfunc(mytable)) -- 45
我认为myfunc
没问题。
table.myfunc = myfunc
print(mytable:myfunc())
-- lua: main.lua:18: attempt to call method 'myfunc' (a nil value)
-- stack traceback:
-- main.lua:18: in main chunk
-- [C]: ?
print(mytable)
显示table: 0x9874b0
,但该表未定义函数?
mytable.myfunc = myfunc
print(mytable:myfunc()) -- 45
这很有用。它是唯一更喜欢这样做的方式吗?
答案 0 :(得分:1)
有很多方法可以在表中定义函数。
我认为你的第一个代码的问题是你有这个:
table.myfunc = myfunc
应该是:
mytable.myfunc = myfunc
在您的情况下,mytable.myfunc
为零,因为您从未为其指定过值
你可以写
local mytable = {}
function mytable.myfunction()end
或
mytable.myfunction = function()end
或
mytable["myfunction"] = function()end
或单独定义myfunc并稍后将其分配给mytable.myfunc
如果你想从你的函数中访问其他表成员,我建议你定义这样的函数:
function mytable:myfunc()end
是
的语法糖function mytable.myfunc(self)end
如果您这样做,可以通过关键字self
在你的情况下,它最终会像:
function mytable:myfunc()
local sum = 0
for _, n in ipairs(self) do
sum = sum + n
end
return sum
end
所以你不再需要函数参数t了,你可以运行所需的mytable:myfunc()
否则你必须写mytable:myfunc(mytable)
。
答案 1 :(得分:-1)
table.myfunc = myfunc
print(mytable:myfunc())
这不起作用,因为mytable没有名为myfunc的成员,表没有。 你要么必须写
table.myfunc = myfunc -- assign myfunc to TABLE (not the same as mytable)
print(table.myfunc(mytable)) -- as with most other functions in table
或
mytable.myfunc = myfunc -- assign myfunc to MYTABLE
print(mytable:myfunc()) -- syntactic sugar for print(mytable.myfunc(mytable))
另外,您可以将该函数定义为
function mytable:myfunc() -- syntactic sugar for mytable.myfunc(self)
-- do something
-- use "self" to access the actual table
end
或
function table.myfunc(t)
-- do something
end