是否可以在Lua表中全局定义函数

时间:2016-03-13 10:31:49

标签: lua

如何将功能定义到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

这很有用。它是唯一更喜欢这样做的方式吗?

2 个答案:

答案 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

访问mytable的会员

在你的情况下,它最终会像:

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