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

时间:2017-01-14 12:59:47

标签: 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_loadfile我只能得到这个块。如果我调用lua_dofile,我会得到元素,但是alma函数会为每个元素运行。在this SO线程中,有人说要将这些东西包装成函数并调用它来获取数据。当我打包/调用函数时,3个alma函数在我调用getter时运行。如何在不执行alma函数的情况下获取sometable及其元素?

2 个答案:

答案 0 :(得分:2)

  

我想为gui元素设置onClick事件   一些函数,因此{"一些字符串",函数}表元素

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

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

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

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

答案 1 :(得分:1)

如果不调用某些功能,您将无法获得任何价值。任何加载的块都是一个函数。不是数据,而是构造/返回数据的函数。您必须调用它,因此它将填充一些全局变量,或显式返回值 如果您不想呼叫alma(),请不要拨打电话。在不致电alma()的情况下填写表格 例如:

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

  nested = {
    {"a", "argument"},
    {"table", "arg"},
    {"element", "asd"}
  }
}

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