【问题标题】:Lua: How to extract function from _G?Lua:如何从_G中提取函数?
【发布时间】:2018-03-01 15:28:59
【问题描述】:

目前我正在尝试显示存储在 _G 中的所有内容。 在 _G 中读写表格非常容易。

有谁知道如何对 type 函数做同样的事情?

我的目标是返回一个包含存储在 _G 表中的函数的字符串。

干杯,谢谢 最大

【问题讨论】:

  • Lua启动时存储在_G中的所有函数都是C函数。你想用它们做什么?
  • 我试图了解调用函数时真正发生的情况。例如:如果我执行 print(Foo),为什么会看到显示 foo 的内容。能理解我吗? ;)
  • 我建议您单独提出一个明确的问题。

标签: lua


【解决方案1】:

您可以获得的关于函数的唯一信息是其参数的名称(除非调试信息被剥离)。

local function print_func(func)
   local addr = tostring(func):match'%X(%x+)%X*$'
   local info, params = debug.getinfo(func, 'u'), {}
   for i = 1, info.nparams do
      params[i] = debug.getlocal(func, i)
   end
   if info.isvararg then
      params[#params+1] = '...'
   end
   print('function@'..addr..'('..table.concat(params, ', ')..')')
end

local function example(x, y) return x+y end

print(print)     --> function: 000007FEE30B6900
print(example)   --> function: 00000000005CEFD0

print_func(print)     --> function@000007FEE30B6900(...)
print_func(example)   --> function@00000000005CEFD0(x, y)

附:在某些语言(例如 Smalltalk)中,函数对象将其源代码作为其属性公开。

【讨论】:

    【解决方案2】:

    要显示_G 中的所有内容,您可以这样做:

    for n in pairs(_G) do print(n) end
    

    如果您只想获取type 函数:

     for n in pairs(_G) do 
         if n=="type" then
             print(n) 
         end
     end
    

    可以查看上面here的输出

    【讨论】:

    • 嗨,想澄清一下...检查这个语句: print(_G["print"]) 这返回:函数:0x41b850 准确地说,我想阅读这个返回的“背后的原因”。
    • 你的意思是要检查print在lua中是如何实现的?您无法在普通 Lua 中访问内置函数的主体,因为print 的源代码已经编译为字节码。当然,如果您想查看print 的源代码,您可以查看语言仓库中的lua C 文件。
    • 不好的例子,因为我想用一个使用 lua 的程序提供的函数来完成你描述的过程。该功能没有用内置...描述,它有某种字母数字代码。
    • 啊,我明白你的意思了。您可以为此使用debug 库及其getinfo 函数,尽管我认为您不能立即访问函数的主体。 debug.getinfo 可以返回很多有用的info,例如函数的name,以及定义该函数的源代码中的第一行和最后一行号。因此,您可以使用所有这些来编写解析器来获取函数的确切主体。查看相关示例here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2017-09-11
    • 2015-07-14
    相关资源
    最近更新 更多