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

C++ 加载Lua文件并使用变量而不执行函数,c++,lua,C++,Lua,我试图从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\u loadfile我只得到

我试图从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\u loadfile
我只得到块。如果我调用
lua\u dofile
我会得到元素,但是alma函数会为每个元素运行。在SO线程中,有人说要将这些类型的内容包装到函数中,然后调用这些函数来获取数据。当我包装/调用函数时,3个alma函数在调用getter时运行。如何在不执行alma函数的情况下获取
sometable
及其元素?

如果不调用某个函数,则无法获取任何值。加载的任何块都是一个函数。不是数据,而是构造/返回数据的函数。您必须调用它,这样它将填充一些全局变量,或显式返回值。
如果不想调用
alma()
,则不要调用它。填写表格,无需调用
alma()

例如:

return {
  num = 5,
  text = "this is a string",

  nested = {
    {"a", "argument"},
    {"table", "arg"},
    {"element", "asd"}
  }
}
您必须加载并调用此块,它将构造并返回带有
.nested
子表的表,并且不会调用
alma()

我想为gui元素提供onClick事件,这将是 一些函数,因此是{“some string”,function}表元素

好的,您需要稍后调用函数。只需保存该函数的值,即只需写下其名称:

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"}
}

所以我不能像那样嵌套函数,如果我想避免在加载时自动调用函数,我必须避免在数据中引用函数?感觉像涉及XY问题。你坚持要有函数,但不想调用它们。你的具体任务是什么?你想实现什么?我想在Lua中编写GUI数据,并将其加载到C++中,这样我就不必在程序稍作调整时继续编译程序,而且我想对GUI元素进行OnCutt事件,这将是一些函数,因此{“某些字符串”,函数}表元素。您可以在表上使用metatable来实现该表中某些元素的惰性计算。因此,只有当您第一次访问相应的元素时,
alma
才会被调用。此功能是透明的:您不必显式调用某些函数。@val,关键是函数是一个值。它没有名称,但可能有一个或多个变量或字段引用它。