1

我有一个函数foo可以在某些情况下获取 nil 值,即foo(VarA)whileVarA未定义。这个 undefinedVarA应该被解释为"VarA"但我不能调用foo("VarA"),因为VarA它应该作为一个选项参数(不同于普通的字符串参数)。

mt = {__index = function(t, k) return k end}
setmetatable(_G, mt)

这将获得所需的结果,但现在所有其他未定义的变量都将返回其名称。喜欢abc -> "abc"。您是否看到在这种特定情况下仅激活元表的任何方法?我可以在我的方法中切换元表,foo但是当我在foo块中时,传递的参数已经为零并且为时已晚。

附录:我认为这个问题不够具体。Schollii 将参数作为表格传递的答案很好,但没有按预期工作:

foo({option1 = delete, option2 = push})

这应该有键信息(选项 1 和选项 2)加上值的信息(即使删除和推送在全局或本地命名空间中不存在)。Schollii 的方法会给我关键信息而不是价值信息(如“删除”和“推送”)。我不能预先定义删除和推送,因为这些新的“关键字”应该稍后由函数本身定义。将这些新关键字作为字符串传递是没有选择的。

4

2 回答 2

1

看起来您正在 Lua 中开发一种特定领域的语言。如果这是您的意图并且您成功了,那就太好了。否则,最好坚持更典型的 Lua 编程风格。

与其他建议类似:

-- lets the caller decide on the scope of varA
-- and the default string
foo(varA or "varA") 
于 2014-05-21T11:14:51.223 回答
0

您只需要测试 nil 并将 VarA 的值设置为其名称:

function yourFunc(VarA)
    VarA = VarA or "VarA" -- if VarA is nil, it becomes the string "VarA"
    ... use VarA ...
end

However, you say that VarA should act as an option parameter. 我猜你的意思是 VarA 是可选的。好的,但是 Lua 不支持函数调用中的命名参数,所以如果你有

 function yourFunc(arg1, arg2, optArg1, optArg2)
     ...
 end

然后为了使用 optArg2=something 调用 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 以便仅将非数组键插入到第二个循环中。

于 2014-05-21T04:59:35.140 回答