我有一个函数foo
,在某些情况下可以获得nil值,即foo(VarA)
,而VarA
未定义。这个未定义的VarA
应该被解释为"VarA"
但我不能调用foo("VarA")
,因为VarA
应该作为选项参数(与普通字符串参数不同)。
mt = {__index = function(t, k) return k end}
setmetatable(_G, mt)
这将获得所需的结果,但现在每个其他未定义的变量都将返回其名称。像abc -> "abc"
一样。您是否认为在这种特定情况下只能使用metatable?我可以在我的foo
方法中切换元数据但是当我在foo
块时,传递的参数已经是零并且为时已晚。
附录:我认为这个问题不够具体。 Schollii将params作为一张桌子的答案很好,但没有按预期工作:
foo({option1 = delete, option2 = push})
这应该包含密钥信息(option1和option2)以及值的信息(即使全局或本地命名空间中不存在delete和push)。 Schollii的方法会给我关键信息,但不会提供价值信息(如“删除”和“推送”)。我无法事先定义删除和推送,因为这些新的“关键词”应该稍后由函数本身定义。将这些新关键字作为字符串传递是不可取的。
答案 0 :(得分:1)
您似乎正在Lua中开发特定于域的语言。如果这是你的意图而你是成功的,那很好。否则,坚持更典型的Lua编程风格会更好。
与其他建议类似:
-- lets the caller decide on the scope of varA
-- and the default string
foo(varA or "varA")
答案 1 :(得分:0)
您只需要测试nil并将VarA的值设置为其名称:
function yourFunc(VarA)
VarA = VarA or "VarA" -- if VarA is nil, it becomes the string "VarA"
... use VarA ...
end
但是,您说VarA应该作为选项参数。我认为你的意思是VarA是可选的。好的,但Lua不支持函数调用中的命名参数,所以如果你有
function yourFunc(arg1, arg2, optArg1, optArg2)
...
end
然后为了使用optArg2 =某事调用yourFunc,你必须将optArg1设置为nil:
yourFunc(1, 2, nil, 3)
换句话说,你不能做yourFunc(1,2,optArg2=3)
这将是非常整洁的。但是你可以通过让yourFunc接受一个表而不是一个参数列表来接近它们:
function setOptionalArgs(tbl, defaults)
for i,v in ipairs(defaults) do
if tbl[v] == nil then
tbl[v] = v
end
end
for k,v in pairs(defaults) do
if tbl[k] == nil then
tbl[k] = v
end
end
end
function yourFunc(args)
setOptionalArgs(args, {'arg1', arg2=2, 'arg3'})
-- ... use args.arg1, args.arg2 etc ...
print(args.arg1, args.arg2, args.arg3)
end
yourFunc {}
现在你可以打电话了
yourFunc {arg1=1}
将自动拥有arg2 =" arg2"。请注意,要清理,您应该修改setOptionalArgs,以便只在第二个循环中插入非数组键。