加载 Lua 文件并使用变量而不执行函数

Load Lua file and use variables without executing functions

本文关键字:执行 函数 变量 Lua 文件 加载      更新时间:2023-10-16

我正在尝试从Lua将表加载到C++中。文件的外观如下:

function alma(arg)
  print(arg)
end
sometable = {
  num = 5,
  text = "this is a string",
  nested = {
    {"a", alma("argument")},
    {"table", alma("arg")},
    {"element", alma("asd")}
  }
}

如果我打电话给luaL_loadfile我只会得到块。如果我调用lua_dofile我会得到元素,但 alma 函数为每个元素运行。在这个SO线程中,有人说将这些东西包装到函数中并调用它来获取数据。当我包装/调用函数时,3 个 alma 函数在我调用 getter 的那一刻运行。如何在不执行 alma 函数的情况下获取sometable及其元素?

我希望为 gui 元素提供 onClick 事件,这将是 一些函数,因此 {"一些字符串",函数} 表元素

好的,您需要稍后调用函数。只需保存该功能的值,即简单地写下它的名称:

nested = {
    {"a", func_argument},
    {"table", func_arg},
    {"element", func_asd}
  }

但是你想调用相同的函数,传递参数。并且您希望将该信息保存为函数。因此,要么直接在表中定义一个函数,要么调用某个将返回另一个函数的函数,将其参数存储在闭包中:

-- function to be called
function alma(arg)
    print(arg)
end
-- define functions in table
nested1 = {
    {"a", function() alma "argument" end},
    {"table", function() alma "arg" end},
    {"element", function() alma "asd" end}
}
-- or create function within another function
function alma_cb(name)
    return function() alma(name) end
end
nested2 = {
    {"a", alma_cb "argument"},
    {"table", alma_cb "arg"},
    {"element", alma_cb "asd"}
}

如果不调用某个函数,就无法获取任何值。加载的任何块都是一个函数。不是数据,而是构造/返回数据的函数。你必须调用它,这样它才会填充一些全局变量,或者显式返回值。
如果你不想alma()被召唤,那就不要叫它。填满你的桌子,不要打电话给alma()
例如:

return {
  num = 5,
  text = "this is a string",
  nested = {
    {"a", "argument"},
    {"table", "arg"},
    {"element", "asd"}
  }
}

您必须加载并调用此块,它将构造并返回带有子表.nested表,并且不会调用alma()