【问题标题】:How to handle unknown initializer functions in lua?如何处理lua中未知的初始化函数?
【发布时间】:2010-04-28 17:25:13
【问题描述】:

我想加载用 lua (eyeonScript) 的变体编写的数据。但是,数据中充斥着对非普通 lua 中的初始化函数的引用:

Redden = BrightnessContrast {
    Inputs = {
        Red = Input {
            Value = 0,
        },
    },
}

标准 lua 给出“尝试调用 nil 值”或“意外符号”错误。有没有办法捕捉这些并将其传递给某种通用初始化程序?

我想以嵌套表数据结构结束。

谢谢!

【问题讨论】:

    标签: parsing lua


    【解决方案1】:

    为全局表设置一个__index 元方法。例如,未定义函数的行为类似于身份:

    setmetatable(_G,{__index=function (n)
                               return function (x) return x end
                             end})
    

    【讨论】:

    • 谢谢!这几乎正​​是我所需要的。一个小的副作用是任何拼写错误现在都会变成函数,但是由于我运行 Lua 只是为了解析这个结构,所以我不太担心。
    • 不错的技巧 lhf。 @oofoe:无论如何,您可以做的是创建一个自定义环境来执行其中的配置文件(使用 setfenv),这样它就不会破坏或污染您的正常命名空间。然后,您可以仅在该环境中定义元方法。
    【解决方案2】:

    这里还有一个技巧:将 __call 设置为 nil,但您需要在 C 中或使用调试库来执行此操作。这个技巧的好处是它只处理对未定义函数的调用:

    debug.setmetatable(nil,{__call=function (x,v) return v end})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 2021-12-17
      • 2019-10-05
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多