我有一个函数foo
,在某些情况下可以得到nil值,即foo(VarA)
,而VarA
是未定义的。这个未定义的VarA
应该被解释为"VarA"
,但我不能调用foo("VarA")
,因为VarA
应该作为一个选项参数(不同于正常的字符串参数)。
mt = {__index = function(t, k) return k end}
setmetatable(_G, mt)
这将得到期望的结果,但现在每个其他未定义变量都将返回其名称。比如abc -> "abc"
。在这种特定的情况下,您认为有什么方法可以只激活一个元表吗?我可以在我的foo
方法中切换元表,但是当我在foo
块中,传递的参数已经是nil,已经太晚了。
foo({option1 = delete, option2 = push})
应该包含键信息(option1和option2)加上值的信息(即使在全局或本地命名空间中不存在删除和推送)。Schollii的方法会给我键信息,而不是值信息(如"删除"one_answers"推送")。我不能事先定义delete和push,因为这些新的"关键字"应该稍后由函数本身定义。
看起来您正在Lua中开发一种特定于领域的语言。如果这是你的意图,而且你成功了,那很好。否则,最好还是坚持使用典型的Lua编程风格。
与其他建议类似:
-- lets the caller decide on the scope of varA
-- and the default string
foo(varA or "varA")
您所需要的只是测试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,以便在第二个循环中只插入非数组键。