如何在Lua中跳过可选参数?

4

我一直在使用的方法是:

t1, t2 = LSL:GetDiffItem(item)

方法声明如下:

GetDiffID(item, ignoreEnchant, ignoreGem, red, yellow, blue, meta, ignorePris)

现在我想传递额外的参数,跳过一些参数: 项目忽略附魔忽略宝石红色黄色蓝色忽略价格 我尝试只是跳过这些参数:
t1, t2 = LSL:GetDiffItem(item, ignore, ignore, , , , , ignore)

但是这种方法是行不通的:

“unexpected symbol near ','”

那么,我该如何在Lua中跳过可选参数呢?


参见


1
Lua,不是LUA。它是葡萄牙语中的一个单词。 - Omri Barel
4个回答

8

传递nil。这将与从未传递参数相同。但是,请注意,文档说明可以这样做,因为大多数函数不会检查每个可选参数,只有在提供了前一个参数时才检查每个参数。


1
你可以使用命名参数。如lua.org所述:“当函数有很多参数,而且大部分都是可选的时,这种参数传递方式特别有用。”
思路是将所有参数作为一个表进行传递:
function InfoItem(item)
  if item.name then
    print("Name: ",item.name)
  end
  if item.color then
    print("Color: ",item.color)
  end
  if item.enchant then
    print("Enchant: ",item.enchant)
  end
  if item.specialInfo then
    print(item.specialInfo)
  end
end

InfoItem{name = "Internet Troll's Bane", color = "silver"}
InfoItem{name = "Death's Toenail Clipper", enchant = "unbreakable", specialInfo = "Little effort required to cut through the thickest nails."}

文档说明这是可能的。然而,当我运行 wibox.widget.textclock{format = "%a %Y-%m-%d %H:%M %Z", timezone = "Z"} 时,出现了错误“bad argument #2 to 'format' (string expected, got table)”,而 wibox.widget.textclock("%a %Y-%m-%d %H:%M %Z", nil, "Z") 却可以正常工作。这是否需要函数支持? - l0b0

0
如果您正在编写自己的函数(而不是使用预先存在的API),我使用的方法是将表作为函数的唯一参数传递,并在该表中填入相应的值。在函数中将默认值分配给元表作为第一步可以避免在每个步骤中查找默认值,但请确保用户知道您正在覆盖其输入的元表。

0

使用 nil

注意,当C代码中使用gettop或依赖于“NONE”(例如在类型的switch/case语句中),或明确检查无或nil而不是lua_isnoneornil时,此方法将不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接