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

时间:2014-05-20 22:31:11

标签: lua lua-table metatable meta-method

我有一个函数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的方法会给我关键信息,但不会提供价值信息(如“删除”和“推送”)。我无法事先定义删除和推送,因为这些新的“关键词”应该稍后由函数本身定义。将这些新关键字作为字符串传递是不可取的。

2 个答案:

答案 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,以便只在第二个循环中插入非数组键。