【问题标题】:Loop through all Lua global variables in C++ [duplicate]循环遍历C ++中的所有Lua全局变量[重复]
【发布时间】:2013-12-29 15:45:32
【问题描述】:

我已经搜索了很长时间,但还没有找到从 C++ 中获取所有全局变量的方法。考虑一下这个小型 Lua 测试脚本。

myGlobal1 = "Global 1"
myGlobal2 = 2

function test()
  local l1=0
  print (myGlobal1,myGlobal2,l1)
end

test()

假设您在 print (myGlobal1,myGlobal2,l1) 处暂停执行并从 C++ 获取所有全局变量(myGlobal1myGlobal2)。这些示例是任意的,从 C++ 的角度来看,全局变量是未知的。

我一直在查看lua_getglobal(),但我需要先知道变量的名称。我查看了lua_getupvalue(),但结果只得到了“_ENV”。

我想我可以在知道它们的名称后立即使用lua_getglobal(),但是如何获取全局变量列表(来自 C++)?我现在确实有lua_Debug 结构(如果有帮助的话)

编辑 这篇文章最初不是关于迭代表,而是关于如何找到用户自己的全局变量。

但是,我发布了一个解决方案来解决这个问题here

【问题讨论】:

  • Use this 记住全局变量只是 _G 中的索引。
  • @Bartek 所以遍历 _G 会给我所有的全局变量吗?
  • @Tadeusz 它是 Lua5.2,如标签所示 ;)

标签: c++ lua global-variables lua-5.2


【解决方案1】:

好的,我解决了。

lua_pushglobaltable(L);       // Get global table
lua_pushnil(L);               // put a nil key on stack
while (lua_next(L,-2) != 0) { // key(-1) is replaced by the next key(-1) in table(-2)
  name = lua_tostring(L,-2);  // Get key(-2) name
  lua_pop(L,1);               // remove value(-1), now key on top at(-1)
}
lua_pop(L,1);                 // remove global table(-1)

lua_next() 找不到更多条目时,会弹出键名,将表格留在顶部(-1)。

下一个问题是将我自己的全局变量与其他表条目区分开来......

【讨论】:

  • manual 说:“在遍历表时,不要直接在键上调用 lua_tolstring,除非您知道键实际上是一个字符串。回想一下,lua_tolstring 可能会更改给定索引处的值;这会混淆对lua_next 的下一次调用。”。您不太可能有一个名称不是字符串的全局变量,但它可能会发生。
  • 是的,我想通了。我忘了编辑关于它的帖子。我正在尝试找到一种更好的方法来过滤掉我的全局变量。
  • 问一个关于过滤全局变量的单独问题。
  • @lhf 是的,我发布了一个新问题;)stackoverflow.com/questions/20527659/…
  • @MaxKielland:感谢您发布此信息。我正在尝试一个答案并崩溃了,因为我将-1 作为表的索引传递给lua_next()lua_next() (lua.org/manual/5.2/manual.html#lua_next) 的文档有一个走桌子的例子,但只说“桌子在索引't'的堆栈中”。在评论点,表的堆栈索引是-1 - 这就是我尝试过的。出于某种原因,我从来没有点击过我应该尝试-2,回想起来似乎应该是显而易见的尝试。
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 2017-09-08
  • 2020-08-18
  • 2015-04-05
  • 2012-01-20
  • 1970-01-01
  • 2016-03-15
  • 2013-05-25
相关资源
最近更新 更多