lua函数在表格中包含参数

我是lua的新手,想要在一个表格里存储具有在“存储时”给定参数的函数。

尝试了下面的代码,但显然并不是我想要的。

local functable = {}
local function myfunc(x,y)
    print(x ,y)
end

table.insert(functable, {func = myfunc})
table.remove(functable).func("hello", "World")

我想在“insert”时存储变量,所以我尝试将参数存储在表格中:

functable = {}

function myfunc()
    print(functable[#functable].p1 ,functable[#functable].p2)
end

table.insert(functable, {func = myfunc, p1="Hello", p2="World"})
table.remove(functable).func()

但是这段代码不起作用。

有人能告诉我正确的方向吗?

点赞
用户7396148
用户7396148

你的代码问题在于一旦你用 table.remove ,你就无法使用 functable[#functable] 恢复 p1p2。如果你输入第二个函数,你会看到打印输出但打印的参数将是你在表格中下一个函数的参数。

table.insert(functable, {func = myfunc, p1="Goodbye", p2="World~"})
table.insert(functable, {func = myfunc, p1="Hello", p2="World!"})
table.remove(functable).func()

输出:

Goodbye World~


我建议的解决方案是在表格中设置参数,然后在调用函数时应用这些参数:

functable = {}

local function myfunc(x,y)
    print(x ,y)
end

table.insert(functable, {func = myfunc, params = {"Goodbye", "World~"}})
table.insert(functable, {func = myfunc, params = {"Hello", "World!"}})

local action1 = table.remove(functable)
local action2 = table.remove(functable)

action1.func(table.unpack(action1.params))
action2.func(table.unpack(action2.params))

另一种解决方案是包装您的函数并将参数设置为 upvalues。

这是一个示例:

functable = {}

function myfunc(...)
    local params = {...}

    local function func()
        print(params[1] ,params[2])
    end

    return func
end

table.insert(functable, {func = myfunc("Goodbye", "World~")})
table.insert(functable, {func = myfunc("Hello", "World!")})

table.remove(functable).func()
table.remove(functable).func()
2019-08-29 15:42:26
用户6834680
用户6834680

这是对 Nifim 的第一个变体的修改:

functable = {}

local function myfunc(x,y)
   print(x, y)
end

local F_mt = {}

function F_mt:__call()
   return self.func(table.unpack(self.params))
end

local function F(obj)
   return setmetatable(obj, F_mt)
end

table.insert(functable, F{func = myfunc, params = {"Goodbye", "World~"}})
table.insert(functable, F{func = myfunc, params = {"Hello", "World!"}})

table.remove(functable)()
table.remove(functable)()

其中,functable 是一个空表。 myfunc(x,y) 是一个打印 x 和 y 的函数。 F_mt 是一个元表,定义了如何调用一个函数对象。 F(obj) 将一个函数对象设置为带有 F_mt 的元表。table.insert 将两个函数对象插入 functable 中。 table.remove(functable)() 将 Remove functable 中的最后一个元素并调用,两次调用 myfunc

2019-08-29 16:49:31
用户3574628
用户3574628

而不是存储 myfunc 函数,你真正想要存储一个没有参数的类似函数。换句话说,一个闭包:

local functable = {}

local function myfunc(x, y)
  print(x, y)
end

local function addArguments(f, ...)
  local args = {...}
  return function()
    return f(table.unpack(args))
  end
end

table.insert(functable, addArguments(myfunc, 'Hello', 'World'))
table.remove(functable)()

这种方法与 Egor 的方案不同之处在于,它使用闭包而不是表来捆绑函数和参数。

2019-08-29 21:04:38