首页 > 解决方案 > 当使用 Lua 作为嵌入式语言时,例如 c++,是否有任何简单/方便的方法可以找到在 Lua 中定义变量的位置?

问题描述

我正在研究嵌入到 C++ 中的 Lua 脚本。我发现找到一个变量的原始定义真的很不方便,它在 Lua 中使用并且很可能在 c++ 中定义。例如,

function Guidance.get_turn_lanes(way,data)
  local psv_fw, psv_bw = get_psv_counts(way,data)      
  local turn_lanes_fw, turn_lanes_bw = Tags.get_forward_backward_by_key(way,data,'turn:lanes') 
  local vehicle_lanes_fw, vehicle_lanes_bw = Tags.get_forward_backward_by_key(way,data,'vehicle:lanes') 

  return process_lanes(turn_lanes_fw,vehicle_lanes_fw,psv_bw,psv_fw) or turn_lanes,   -- where to find the definition of variable turn_lanes? 
         process_lanes(turn_lanes_bw,vehicle_lanes_bw,psv_fw,psv_bw) or turn_lanes    
end

现在我使用 Atom 的 Find in Project 选项卡来搜索关键字turn_lanes以尝试定位它的定义位置。我想知道,有没有更好的方法来找到 的原始定义turn_lanes?此外,一般来说,c++ 和 lua 是如何相互交流的?(我希望第二个问题不要太天真或太笼统。)

标签: c++lua

解决方案


是和否。

Lua 并不真正记得变量的定义位置(也不关心)。但是,您可以尝试一些技巧,具体取决于您要寻找的内容。

__newindex元方法

例如,您可以将元方法附加__newindex_G,每次定义新的全局变量时都会打印一些输出。放置在脚本中其他任何内容之前执行的某个地方。您可以使用它debug.getinfo来确定您在调用堆栈中的位置。

也许您可以在-l加载任何其他模块之前使用该标志来加载此hack(并在安装钩子之前潜入一个全局变量)

debug.getinfo

如果您正在寻找一个 Lua 函数,您可以使用它debug.getinfo来确定该函数的定义位置。这对于在没有使用调试信息的情况下编译的代码效果较差luac -s

外部工具

在许多情况下,使用外部工具在代码中查找内容会更容易。您问题下的评论提到了一些不错的选择:

  • ZeroBrane(一个 Lua IDE)
  • git grep (如果你使用 git)

推荐阅读