在Lua中,处理包含nil的可变参数的正确方法是什么?

2024-03-20

我正在尝试创建一个调试打印函数,它将文件句柄作为第一个参数。首先,我写一个这样的函数:

function fprint (f, ...)
   for i, v in ipairs{...} do
      f:write(tostring(v))
      f:write("\t")
   end
   f:write("\n")
end

只要我不通过这个功能就有效nil参数中的值。但如果我用一个来称呼它nil,它不打印nil值和其余参数。

fprint(io.stderr, 1, 2, nil, 3)
=> prints only 1 and 2

那么,解决这个问题的正确方法是什么?


其实很容易处理nilvarargs 中的值,您所需要做的就是使用select http://www.lua.org/manual/5.1/manual.html#pdf-select函数,甚至可以使用nil(它计算参数的实际数量)。下面的惯用法非常有用,它是一个核心库函数table.pack http://www.lua.org/manual/5.2/manual.html#pdf-table.pack在 Lua 5.2 中:

function table.pack(...)
  return { n = select("#", ...), ... }
end

参数的数量存储在字段中n,所以为了迭代它们,只需使用:

function vararg(...)
    local args = table.pack(...)
    for i=1,args.n do
        -- do something with args[i], careful, it might be nil!
    end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Lua中,处理包含nil的可变参数的正确方法是什么? 的相关文章

  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • 我应该用 C++ 封装 Lua 代码的哪些代码?

    我终于将 LuaBind 配置为与我的 C 项目一起使用 我最近发现 Tiled 地图编辑器可以选择将文件导出为 lua 所以我想尝试一下 我将使用什么代码来封装下面粘贴的代码以使其与我的 C RPG 项目一起使用 return versi
  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 在Lua中获取前一天的日期

    谁能告诉我如何使用 Lua 获取 YYYY MM DD 格式的前一天日期 即 一个片段 它将返回运行当天的前一天的日期 Try print os date Y m d os time 24 60 60 严格来说 这只能保证在 POSIX 系
  • Lua 访问表的键和值

    我想在关卡编辑器中读取 Lua 文件 这样我就可以以可视化格式显示其数据供用户编辑 如果我有一个像这样的 Lua 表 properties Speed 10 TurnSpeed 5 Speed显然是关键并且10价值 我知道如果我知道像这样的
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 如何终止Lua脚本?

    如何终止 Lua 脚本 现在我在 exit 方面遇到问题 我不知道为什么 这更像是一个 Minecraft ComputerCraft 问题 因为它使用了包含的 API 这是我的代码 while true do if turtle dete
  • 如何让我的 add 命令找到第一个变量和第二个变量的值,然后将它们加在一起?

    vars values function open file lex file end function lex file local data io open file r for char in data lines do Print
  • SHA2 512 的改编给出了不正确的结果

    我正在尝试调整 SecureHashAlgorithm 的纯 Lua 实现here http lua users org wiki SecureHashAlgorithm对于 SHA2 512 而不是 SHA2 256 当我尝试使用改编时
  • 如何在 Lua - Lightroom 插件中使用 HMAC

    首先我要提的是我对 Lua 真的很陌生 如果你认为我的问题太愚蠢 请耐心等待 这是我的要求 我需要使用 HMAC sha256 进行 Lightroom 插件开发 因为我使用它是为了安全 我试图使用这个但没有运气https code goo
  • 如何从 Lua 内部运行另一个脚本?

    我需要从另一个 Lua 脚本中执行一个 Lua 脚本 有多少种方法 我该如何使用它们 通常您会使用以下内容 dofile filename lua 但你可以通过以下方式做到这一点require 很好 例子 foo lua io write
  • 克隆一个lua状态

    最近 我在使用C 和Lua进行开发时遇到了很多困难 我的情况是 由于某种原因 我的 C 程序中可能有数千个 Lua 状态 但这些状态在初始化后应该是相同的 当然 我可以为每个状态执行 luaL loadlibs 和 lua loadfile
  • 模式 ^u.meta(\.|$) 未按预期工作

    我有这个模式 u meta 预期行为 u meta 将匹配所有角色 例如 u meta u meta admin u meta admin system u meta 它不应该匹配如下所示的内容 u meta admin u meta ad
  • 在 Lua/LuaFileSystem 中创建一个新文件

    我已经查看了 Lua 和 LuaFileSystem 文档 但尚未找到创建新文件的方法 我也在这里四处寻找 但目的相同 请注意 我正在寻找的解决方案必须与操作系统无关 以确保可移植性 但我很高兴针对不同的系统获得不同的答案 示例 将 Hel
  • 在循环内部或外部声明本地更好吗? [复制]

    这个问题在这里已经有答案了 我习惯这样做 do local a for i 1 1000000 do a
  • 如何循环遍历表并保持顺序?

    我得到了下表 local a 12 30 24 60 60 year 30 24 60 60 month 24 60 60 day 60 60 hour 60 minute 1 second 但是 当我对它进行配对循环并打印 key val
  • 构建自动化和 MySQL Workbench 脚本:正向工程师 SQL CREATE SCRIPT

    我目前正在研究自动化软件构建过程 其中包括 MySQL Workbench 中定义的数据库架构 使用 Workbench 的脚本编写功能 我想打开一个 Workbench 文档并将其架构导出为 SQL CREATE 脚本 我想知道是否有一个

随机推荐

  • 上下移动 ListViewItems

    我有一个 ListView WinForms 我想通过单击按钮来上下移动项目 要移动的项目是已检查的项目 因此 如果选择了第 2 6 和 9 项 当我按下向上移动按钮时 它们将变为 1 5 和 8 并且这些位置上的项目将向下移动一步 我觉得
  • 基于标签的 SQL 查询

    我已经有一段时间没有做过任何 SQL 了 我不确定这个问题是否有一个简单的解决方案 我也有点菜鸟 我正在尝试构建一个图像库 允许用户使用标签来搜索图像 然后单击其他标签来优化搜索并减少结果数量 但我在所涉及的查询方面遇到了大问题 这是我当前
  • 从 firebase Swift 加载聊天

    我目前正在做一个聊天信使 我能够检索我发送给其他用户的所有消息 但无法检索他们发送的任何消息 我用来加载消息的代码是 func loadMsg let toId user id let fromId Auth auth currentUse
  • CMake 不再找到静态 Boost 库

    我正在开发一个依赖 Boost 的大型 C 项目 该项目使用 CMake 在各种平台上构建 在我的 Windows 计算机上 我使用 CMake 2 8 9 Visual Studio 2010 和 Boost 1 50 0 从源代码构建
  • 从 Openlayers 3 视口获取所有功能

    我试图找出 Openlayers 3 中图层上可见的所有功能 视口 如果我向地图添加点击事件 我可以找到一个功能 如下所示 但我无法找到视口中可见的所有功能 有人可以帮忙解决这个问题吗 map on click function evt v
  • 如何使用geodjango返回距某个点最近距离的记录?

    我正在使用 geodjango 并在我的数据库中有一个点的集合 为了获取某个区域内的点的查询集 我使用以下命令 queryset Spot objects filter point distance lte origin distance
  • Android 使用包含另一个 hashmap 的 hashmap 实现 Parcelable 对象

    这是一个扩展Android 实现具有 hashmap 的 Parcelable 对象 https stackoverflow com questions 22498746 android implement parcelable objec
  • XSS 背后的一般概念是什么?

    跨站脚本 XSS 是一种类型 计算机安全漏洞 通常出现在网络应用程序中 这使得恶意攻击者能够 将客户端脚本注入网络 其他用户查看的页面 一个 利用跨站点脚本 漏洞可被攻击者利用 绕过访问控制 例如 同源政策 跨站点 在网站上执行的脚本是 大
  • RXJava - 制作一个可暂停的可观察对象(例如带有缓冲区和窗口)

    我想创建执行以下操作的可观察对象 在暂停时缓冲所有项目 立即发出项目 同时它们不会暂停 暂停 恢复触发器必须来自另一个可观察的 必须保存它才能供不在主线程上运行的可观察对象使用 并且必须保存更改主线程的暂停 恢复状态 我想用一个Behavi
  • Android - Firebase - 我需要删除每个侦听器吗?

    我做了相当多的研究 但找不到我需要的答案 我所知道的是 当我将 ValueEventListener 附加到数据库引用时 我知道稍后需要将其删除 现在发现很难解决 因为存在大量内存泄漏 我不知道的是 我还需要分离所有其他侦听器吗 这包括 F
  • java.lang.RuntimeException:android.os.TransactionTooLargeException:在片段之间导航时数据包大小 558780 字节

    我在用Bundle在活动和片段之间传输数据 当我从一个片段导航到新片段时 不传输数据或使用Bundle为了获取数据 应用程序崩溃并出现以下错误 gt gt 10 09 11 36 09 100 467 467 E JavaBinder FA
  • FragmentStatePagerAdapter 处理 getItem() 位置

    我尝试了这个 但错误的列表被绑定到回收器视图 我也尝试过 SparseArray 即使这样也不起作用 当我启动 Mainactivity 时 getItem 被调用两次 退回的仓位如何处理 我尝试返回 viewpager currentIt
  • JavaScript 未定义替换为 null

    在 JavaScript 中undefined可以重新分配 因此通常建议创建一个自执行函数 以确保 undefined 实际上是未定义的 作为备选null and undefined肯定是 但任何其他值都大致相当于null undefine
  • 无法在主机上创建 node_modules 文件夹并将主机文件夹挂载到容器

    我的 dockerfile 将运行 npm install 但是之后docker compose build即使在看到构建后 我的主机文件夹中的文件夹 node modules 仍然为空 我怎样才能获得该文件夹并反映在主机中 这是 dock
  • 内容安全策略 (CSP) 如何运作?

    我在开发者控制台中收到一堆错误 拒绝评估字符串 拒绝执行内联脚本 因为它违反了以下内容安全策略指令 拒绝加载脚本 拒绝加载样式表 这是怎么回事 内容安全策略 CSP 如何运作 我该如何使用Content Security PolicyHTT
  • DataGridView 的 CellValueChanged 与 CellValidating 事件

    为 DataGridView 实现验证逻辑代码和条件格式代码的最佳位置是什么 在我读过的许多关于该控件的书籍和文章中 似乎表明处理该控件的适当事件是 CellValidating 事件 嗯 这个名字不仅仅意味着这一点 然而 根据我的口味 此
  • 为什么 PHP 中的函数 levenshtein 有 255 个字符的限制?

    有谁知道为什么这个功能编辑 http php net manual en function levenshtein phpPHP 有 255 个字符的限制吗 这是该函数的 PHP 完整实现 正如您所看到的 有基于字符串字符长度的嵌套循环 f
  • 如何用c++发一副牌

    我的要求如下 int Deal int CardSet CardSet 将两只手分成两手CardSet争论通过了 每手牌的数量是第一个参数 应一次从当前组中取出一张牌 将牌置于交替手中 例如 如果当前集合保持2S 3S 4S 5S 6S 7
  • 具有管理员权限的 Windows 窗体启动

    我有一个 Windows 窗体应用程序 需要管理员权限才能运行 为此 我使用以下代码
  • 在Lua中,处理包含nil的可变参数的正确方法是什么?

    我正在尝试创建一个调试打印函数 它将文件句柄作为第一个参数 首先 我写一个这样的函数 function fprint f for i v in ipairs do f write tostring v f write t end f wri