通过变量名解释未定义的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)以及值的信息(即使 delete 和 push 在全局或局部命名空间中不存在)。Schollii 的方法会给我关键信息,但不是值信息(如 "delete" 和 "push")。我无法预先定义 delete 和 push,因为这些新的“关键字”应该由函数本身稍后定义。将这些新关键字作为字符串传递不是一个选项。

点赞
用户869951
用户869951

你所需要的就是测试是否为 nil 并将 VarA 的值设为其名称:

function yourFunc(VarA)
    VarA = VarA or "VarA" -- 如果 VarA 是 nil,则变为字符串 "VarA"
    ... 使用 VarA ...
end

然而,你说 VarA 应该作为可选参数。我猜你是指 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'})
    -- ... 使用 args.arg1、args.arg2 等等...
    print(args.arg1, args.arg2, args.arg3)
end

yourFunc {}

现在你可以调用

yourFunc {arg1=1}

它将自动设置 arg2="arg2"。请注意,为了简洁,你应该修改 setOptionalArgs,以便仅在第二个循环中插入非数组键。

2014-05-21 04:59:35
用户2226988
用户2226988

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

类似于其他建议:

-- 让调用者决定 varA 的作用域
-- 和字符串的默认值
foo(varA or "varA")
2014-05-21 11:14:51