在 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

这行得通吗? 这是唯一的首选方式吗?

点赞
用户2858170
用户2858170

有很多种方法可以在表格中定义函数。

我认为你的第一段代码的问题在于你有这样的语句:

table.myfunc = myfunc

应该改成:

mytable.myfunc = myfunc

在你的代码中,mytable.myfunc 是 nil,因为你没有给它赋一个值。

你可以这样写:

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)

2016-03-13 11:25:29
用户4984564
用户4984564

这不会起作用,因为mytable没有叫做myfunc的成员属性,而是table才有。你需要这样改写:

table.myfunc = myfunc --将 myfunc 赋值给 TABLE(与 mytable 不同)
print(table.myfunc(mytable)) --与表中的其他函数一样

或者

mytable.myfunc = myfunc --将 myfunc 赋值给 MYTABLE
print(mytable:myfunc()) --语法糖通过 print(mytable.myfunc(mytable)) 转换

另外,你可以这样定义函数:

function mytable:myfunc() -- 通过 mytable.myfunc(self) 语法糖完成
    -- do something
    -- 使用 "self" 来访问实际的表
end

或者

function table.myfunc(t)
    -- do something
end
2016-03-14 12:36:07