Lua:通过名称解释未定义的变量



我有一个函数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,已经太晚了。

我认为这个问题不够具体。Schollii将参数作为表传递的答案很好,但没有按预期工作:
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,以便在第二个循环中只插入非数组键。

最新更新