为什么 debug.getinfo(1) 的 'name' 为 nil

2024-02-27

我正在尝试构建一个 lua 测试框架,让您知道有问题的函数,但是当我从 loadstring 切换到_G,(我进行了切换,以便我的测试工具可以看到函数调用的结果)我的函数开始使用“nil”作为函数名称

Why can _G在下面的代码中没有检测到当前函数的名称?另外,如何从 loadstring 获取返回结果(即 blah 调用中的“false”)或在使用时设置函数名称_G(即告诉lua解释器函数名应该是什么)?

function run_test(one, two)
    if one ~= two then
        print(debug.getinfo(2).name..' Failed')
    end
end

function blah()
    run_test(false, true)
    return false
end

local fname = 'blah'
local status, result = pcall(_G[fname])  -- Outputs 'nil'; result is 'false'
local status, result = pcall(loadstring(fname..'()'))  -- Outputs 'blah', result is 'nil'

我需要的主要是一种使用函数名称字符串来调用函数的方法,能够在调用中看到函数名称(对于测试失败,指向失败的函数,例如 fname = 'blah' 中的上面的代码)并能够得到返回值

local fname = 'blah'
status, result = pcall(??Call fname somehow??)
assert(status)
assert(not result)

--stdout should be "blah Failed"

这是 Lua 用于提供函数名称的启发式方法的限制。

在Lua中,所有函数都是匿名的。给定函数可以是多个变量的值:全局变量、局部变量和表字段。 Lua 调试系统尝试通过查看正在执行的字节码,根据值的来源找到合理的名称。

考虑更简单的例子

blah()
pcall(blah)

在第一次调用中,调试系统看到被调用的函数来自全局blah and debug.getinfo(1).name给出预期结果,blah.

在第二次调用中,调试系统发现被调用的函数来自第一个参数pcall但它并没有进一步去了解这个论点的来源,并且debug.getinfo(1).name gives nil.

当你打电话时也会发生同样的事情_G[name]()。调试系统看到的只是表的一个字段,而该字段的名称相差太远。

尝试添加print(debug.traceback())作为第一行blah查看对此解释的另一种看法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 debug.getinfo(1) 的 'name' 为 nil 的相关文章

  • Lua 表.concat

    有没有办法使用table concat的arg 2值来表示当前表索引 eg t t 1 a t 2 b t 3 c X table concat t n 表 concat X 的所需输出 1 a n2 b n3 c n 简单的回答 不 ta
  • 如果模式匹配,则打印 lua 表中的值

    好吧 我最近刚接触 lua 发现自己陷入了以下困境 我有函数peripheral getNames 这是一个自定义函数 它将返回一个具有结构 key value 的表 而 key 始终是一个数字 从 1 开始 value 将是该函数找到的内
  • 如何在表格内打印表格的内容? [路亚]

    我想做的只是在表中打印表的内容 例如 local stats table1 tTable1 data 1 tTable2 data2 2 tTable3 data3 3 我并不真正关心表 1 或所有表 而是关心数据变量中的信息 我怎样才能打
  • Lua 中的“加载”有什么作用?

    我试图解决我的理解问题loadLua 脚本中的函数 但没有该命令的任何示例或指南 它在他自己的 Lua 网站上讲述https www lua org manual 5 2 manual html pdf load https www lua
  • Lua:setfenv() 与 _ENV

    Lua 切换有什么大不了的setfenv to ENV 在各种 新增内容 资料中 这一举措被认为是 Lua 5 1 和 5 2 版本之间最重要的变化之一 但是 PIL 和其他地方给出的示例可以修剪为以下内容 Lua 5 1 Lua 5 2
  • 如何在 Lua 中下载文件,但在运行时写入本地文件

    我正在尝试制作一个更新程序 以便当我的 Lua 应用程序过时时它将使用LuaSocket下载较新的 exe 文件 可以运行我的 Lua 代码 在这个更新程序中 我希望它显示到目前为止已下载的数量 但是 通过以下 HTTP 请求 它会阻止应用
  • lua检查多个值是否相等

    我喜欢用 Roblox 制作游戏 并用 lua 编写代码 在编写游戏时 我发现自己经常问一个值是否等于另一个值 这可能会产生很长的代码行 并且可能非常重复 例如 如果 x ClassName 衬衫 或x ClassName 附件 或x Cl
  • Lua中如何获取目录列表

    我需要 LUA 中的目录列表 假设我的目录路径为 C Program Files 我需要该特定路径中所有文件夹的列表以及如何搜索该列表中的任何特定文件夹 Example 需要路径 C Program Files 中所有文件夹的列表 以下是上
  • 我应该用 C++ 封装 Lua 代码的哪些代码?

    我终于将 LuaBind 配置为与我的 C 项目一起使用 我最近发现 Tiled 地图编辑器可以选择将文件导出为 lua 所以我想尝试一下 我将使用什么代码来封装下面粘贴的代码以使其与我的 C RPG 项目一起使用 return versi
  • 循环直到在表中找到 2 个特定值?

    我试图找到一种更聪明的方法来解决这个问题 这是与游戏相关的代码的摘录 它循环遍历每个背包的每个插槽 直到找到铲子和绳子 local continue local foundShovel foundRope for i 0 Container
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • lua http套接字超时

    LuaSocket HTTP 模块文档说可以在 HTTP 连接上设置超时 可以设置以下常量来控制 HTTP 模块的默认行为 PORT 用于连接的默认端口 PROXY 用于连接的默认代理 TIMEOUT 设置所有I O操作的超时时间 USER
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • 如何在Conky中实现一个基本的Lua功能?

    我正在尝试向我的 Conky 添加一个函数 该函数打印字符串的长度以用于调试目的 代码位于名为的文件内test lua 非常简单 function test word return string len word end 我这样加载它 在我
  • Lua中如何获取表中的最大整数?

    Lua中如何获取表中的最大整数 在Lua 5 1及更早版本中 你可以使用 math max unpack 1 2 3 4 5 这受到Lua堆栈大小的限制 在 PUC Lua 5 1 上 该值的最大值可达 ca 8000 个数字 如果堆栈空闲
  • 在lua中组合两个函数

    我刚开始学习lua 所以我的要求可能是不可能的 现在 我有一个接受函数的方法 function adjust focused window fn local win window focusedwindow local winframe w
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访

随机推荐

  • C相当于fstream的peek

    我知道在 C 中 您可以使用以下命令查看下一个字符 in peek 当尝试 查看 C 中文件的下一个字符时 我该如何解决这个问题 fgetc http opengroup org onlinepubs 007908799 xsh fgetc
  • 使用 Glumpy 将 NumPy 数组显示为持续更新的图像

    我有一个使用 NumPy 和 SciPy 在 Python 中运行的模拟模型 它会生成一个 2D NumPy 数组作为每次迭代的输出 我一直使用 matplotlib 和 imshow 函数将此输出显示为图像 然而 我发现了 Glumpy
  • 将对象列表分组为尽可能少的子列表,但不超过最大总和

    我正在尝试编写一种方法 将对象分组到最少量的子列表中 而无需混合类型 对象上的 int 字段 或其值的总和超过定义的最大值 它应该看起来像这样 List
  • Maven:如何安装 mvnsh?

    我怀疑我的处理方式完全错误 我听说过mvnsh http shell sonatype org 并想尝试一下 以减少构建时的延迟 但我完全不知道如何做到这一点 我仍在学习 Maven 并在两者之间进行错误的比较mvn和类似的工具gem ca
  • 将使用 AWT 和 Swing 绘制电影的 Java 应用程序移植到服务器端

    我正在使用一些代码 使用 AWT 和 Swing 功能将动画输出写入桌面 它使用 2D 图形进行绘制并以字体呈现文本 此代码可以使用 Java Media Framework 将动画保存到电影文件 我想将此代码移植到纯服务器端环境 以便使用
  • 在 Javascript 中从 JSON 数组查找名称值对的有效方法

    我当前正在调用一个服务 该服务将响应作为具有名称值对的对象数组发送 下面是一个例子 这些名称值对的数量可以是任意顺序 但我只想访问名称 name2 的值 除了循环遍历每个对象并检查名称以获得 name2 的相应值之外 还有其他有效的方法吗
  • 按位右展开算法

    本来这篇文章要求逆绵羊和山羊操作 但我意识到这超出了我的实际需要 所以我编辑了标题 因为我只需要一个右展开算法 http programming sirrida de bit perm html c e 这更简单 我在下面描述的示例仍然具有
  • 派生类的受保护成员未知

    我找到了一个图形的开源类库 当我将它包含在我的项目中时 它有很多错误 我试图修复它们 但是有一个编译错误我无法解决 基类 template
  • 如何使用 GreenDao 3 生成内容提供者?

    在GreenDao 2 x 中 有一个方法叫做Entity addContentProvider 它为实体生成了 ContentProvider 如何在 GreenDao 3 x 中做同样的事情 使用相同的方法 Entity addCont
  • 没有 single-int-arg 构造函数/工厂方法

    我有这个代码 final Person p new Person 1L final ObjectMapper mapper JacksonUtil INSTANCE getMapper final TypeReference
  • Android 滑动抽屉在创建时打开

    我想要一个在应用程序启动时打开的滑块 它将通过按钮等打开 当用户关闭它时 将有更多按钮可以访问 滑动抽屉可以做到这一点吗 我要在 onCreate 方法中添加什么 Thanks XML 布局 在基本 LinearLayout 中
  • 由于在形成 SQL 查询时不赞成字符串替换,因此如何动态分配表名?

    sqlite3 还很新 所以请耐心听我说 我想要一个可以传递表名和要更新的值的函数 我最初是从这样的事情开始的 def add to table table name string cursor execute INSERT INTO ta
  • 启动后gunicorn无法启动

    我正在运行 Debian Web 服务器 其中 nginx 和 Gunicorn 运行 django 应用程序 我已经一切正常并运行良好 但重新启动服务器后 我收到 502 bad gateway 错误 我已将问题追溯到gunicorn 在
  • 不对应于实体的 RESTful 操作/服务?

    我喜欢 RESTful 因为它简单 而且它避免了 SOAP 等普通 企业 系统的弊端 或者 DCOM 和 RPC 的二进制难度 但 REST 似乎比更抽象的服务更适合数据库实体 我想知道您是否可以建议我如何处理这些情况 例如 假设我有一个用
  • Teams 中的 QnA Maker Bot 格式问题

    我们使用 QnA Maker 知识库实现了一个简单的 Azure 机器人 并启用了 Teams 通道 在 webChat 中 Markdown 格式渲染得很好 然而 在 Teams 中 Markdown 格式并不总是按预期工作 如果答案中没
  • 区域多边形未显示在 ggplot2 Choropleth 地图中

    我正在尝试使用 ggplot2 绘制非常基本的地图 我不明白为什么彩色多边形不会显示 看来我的代码与我在许多教程和本网站上已经回答的问题中找到的代码没有什么不同 我认为这可能来自我准备数据的方式 参见下面的 100 可重复示例 librar
  • clflush 不刷新指令缓存

    考虑以下代码段 include
  • readonly 关键字不会使 List<> 成为只读?

    我在公共静态类中有以下代码 public static class MyList public static readonly SortedList
  • read_sql_query() 使用 SQLAlchemy 2.0.0 抛出“'OptionEngine'对象没有属性'execute'”

    首先 我是开发界的一个全新的人 我目前正在学习人工智能 数据科学课程 我的工作之一是使用 SQL 数据库使用 Prophet 进行预测 然后使用这些预测来制作 PowerBI 但目前 我被Python代码困住了 我最初不是开发人员 所以我不
  • 为什么 debug.getinfo(1) 的 'name' 为 nil

    我正在尝试构建一个 lua 测试框架 让您知道有问题的函数 但是当我从 loadstring 切换到 G 我进行了切换 以便我的测试工具可以看到函数调用的结果 我的函数开始使用 nil 作为函数名称 Why can G在下面的代码中没有检测