定义函数参数的默认值

2024-03-11

在 Lua wiki 中我找到了一种为缺失参数定义默认值的方法:

function myfunction(a,b,c)
    b = b or 7
    c = c or 5
    print (a,b,c)
end

这是唯一的方法吗? PHP 风格myfunction (a,b=7,c=5)似乎不起作用。并不是说 Lua 方式不起作用,我只是想知道这是否是唯一的方法。


如果您想要命名参数和默认值(如 PHP 或 Python),您可以使用表构造函数调用函数:

myfunction{a,b=3,c=2}

(这在Lua的很多地方都可以看到,比如LuaSocket协议模块的高级形式 http://w3.impa.br/~diego/software/luasocket/http.html和构造函数IUPLua http://www.tecgraf.puc-rio.br/iup/.)

函数本身可以有这样的签名:

function myfunction(t)
    setmetatable(t,{__index={b=7, c=5}})
    local a, b, c =
      t[1] or t.a, 
      t[2] or t.b,
      t[3] or t.c
    -- function continues down here...
end

参数表中缺少的任何值都将从__index表在其元表中(参见关于元表的文档 http://www.lua.org/manual/5.1/manual.html#2.8).

当然,可以使用表构造函数和函数来实现更高级的参数样式 - 您可以编写您需要的任何内容。例如,here https://gist.github.com/975399是一个函数,它构造一个函数,该函数从定义参数名称和默认值的表中获取命名或位置参数表,以及一个采用常规参数列表的函数。

作为非语言级功能,可以更改此类调用以提供新的行为和语义:

  • 可以使变量接受多个名称
  • 位置变量和关键字变量可以散布 - 并且定义两者可以优先考虑其中一个(或导致错误)
  • 可以创建仅关键字无位置变量,以及无名仅位置变量
  • 相当详细的表构造可以通过解析字符串来完成
  • 如果使用 1 个表以外的其他内容调用函数,则可以逐字使用参数列表

编写参数翻译器的一些有用的函数是unpack(搬到table.unpack在 5.2 中),setfenv(在 5.2 中已弃用,新版本已弃用)_ENV建筑),以及select(它从给定的参数列表返回单个值,或者列表的长度'#').

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

定义函数参数的默认值 的相关文章

随机推荐

  • crontab:正在运行 python 脚本但不执行操作系统命令

    我有这个 crontab 配置设置和以下脚本 MAILTO email protected cdn cgi l email protection 41 15 usr bin python home atweb Documents openg
  • 在 Windows 终端中启用 ANSI 序列

    我偶然发现一个有趣的问题 在 Windows 中 C gt lua gt print x1b 95mMagenta x1b 0m 95mMagenta 0m 但如果我跑os execute 即使使用空命令 在此之前 它按预期工作 C gt
  • string.format(...,**locals()) 的缩写形式

    我通常使用以下模式 如这个问题 https stackoverflow com questions 11764900 using locals and format method for strings are there any cave
  • OTRS Web 服务作为请求者测试

    我是 OTRS 3 2 的新手 也是 PERL 的新手 但我被赋予了设置 OTRS 的任务 以便它将调用我们的远程 Web 服务 以便在设置票证时可以在我们这边创建记录为 已关闭 我设置了各种动态字段 以便客户服务代表可以填写其他数据 这些
  • 解析嵌套 JSON 以检索嵌套数组值

    我试图从这个 Json 中获取一些特定的字段 我已经设法检索第一级中的内容 但我需要从数据字段中获取一些内容 我想获得以下数据字段的数组 data data artist id data artist id name and data ra
  • 如何使 OmniPascal 与 FPC 配合使用?

    我已经为 VisualStudio 代码安装了 FreePascal 编译器和 OmniPascal 扩展 但代码完成不起作用 在手册中你说我需要在用户设置中写入Delphi编译器的路径 但没有提到FPC Set the omnipasca
  • UWP MVVM:更改语言后刷新页面

    我的视图模型中有一些代码可以更改应用程序语言 然后更改某些控件上的文本 这是DashboardViewModel 仪表板页面数据上下文设置为 ApplicationLanguages PrimaryLanguageOverride lang
  • 如何清除或替换缓存的图像

    我知道有很多方法可以防止图像缓存 例如通过 META 标记 以及一些不错的技巧来确保每次页面加载时都显示图像的当前版本 例如 image jpg x timestamp 但是有没有办法真正清除或替换浏览器缓存中的图像 这样上述方法都不是必要
  • 我可以从 Firebase 云功能发送静默推送通知吗?

    是否可以从 APNs iOS 发送静默远程通知Firebase云函数 https firebase google com docs functions 如果是这样 该怎么办 我想在应用程序不在前台时将数据发送到 iOS 应用程序实例 而用户
  • 返回对 C++11 中复数的实数或图像值的引用的函数

    我正在寻找一个函数 该函数返回对 C 11 中复数的实数或图像值的引用 在 C 03 中我可以说 complex
  • 如何将多个类映射到休眠中的一张表?

    根据我的研究 这似乎不太可能 但这是我的用例 我有一个名为 user 的表 其中包含地址 id 我想将 UserReference 和 User 类映射到此表 其中 UserReference 不包含 Address 对象 以节省 sql
  • 在 MacOS arm64e 中安装 php-decimal 并无法获取 libmpdec

    我刚刚升级到带有 M1 的 MacBook 并在安装 php decimal 时使用pecl install decimal 我收到以下错误 checking for libmpdec custom path no checking for
  • 自动配置失败,尝试从 VS 2022 选择自动配置时请检查日志

    I am getting the following error and cannot get past it I also see this issue which I think has something to do with it
  • 简单 XML - 处理节点中的冒号

    我正在尝试从 Flickr 读取 RSS 提要 但它有一些简单 XML 无法读取的节点 media thumbnail flickr profile 等等 我该如何解决这个问题 当我查看 DOM 的文档时我很头疼 所以我想避免它 因为我不想
  • 在 Python 中规范化名称列表

    假设我有一个姓名列表 names King ARTHUR Lancelot The brave galahad the pure Servant patsy GALAHAD THE PURE 我如何规范化列表 以便 the 始终为小写 并且
  • Typescript 中的 Intersection Observer 在 useRef 中抛出错误

    我这里有一个运行完美的文本动画 我现在要添加的是一个 Intersection Observer 这样动画只有在我向下滚动到 Box 时才开始 所以我为实现这一目标所做的是 我使用了反应钩子useRef用作我想要观察的元素的参考并将其应用到
  • 如何在 xcode 6 (swift) 中创建没有情节提要的项目?

    任何人都可以练习在 xcode6 swift 中创建没有故事板的项目吗 我有能力实施 func application application UIApplication didFinishLaunchingWithOptions laun
  • 将多个 Excel 文件中相同结构的工作表追加到一个中

    我想将多个 Excel 文件合并为一个 我想要合并的 Excel 文件具有相同的工作表 所以在这一点上 我想合并不同 Excel 文件中的相同工作表 我有这段代码要组合 但是此代码仅组合了 Excel 文件中的最新活动工作表 Sub sim
  • Firefox 和远程 XSL 样式表

    我正在尝试使用远程 XSL 样式表加载本地 XML 文件 IE 似乎可以很好地处理这个问题 但 Firefox 却不行 有解决办法吗 如果不是语法问题 我认为这是一个同源政策问题 火狐浏览器 和还有 Chrome 和 IE9 https s
  • 定义函数参数的默认值

    在 Lua wiki 中我找到了一种为缺失参数定义默认值的方法 function myfunction a b c b b or 7 c c or 5 print a b c end 这是唯一的方法吗 PHP 风格myfunction a