Lua 有几个工具可以解释代码块。即dofile
,loadfile
和loadstring
。幸运的是,您的输入文件几乎是有效的 Lua 代码(假设这些大括号匹配)。唯一有问题的是interface {
.
上述所有函数都有效地创建了一个函数对象,其中文件或字符串的内容作为它们的代码。dofile
立即执行该函数,而其他函数返回一个函数,您可以随时调用该函数。因此,如果您可以随意更改文件,请将interface
第一行替换为return
. 然后你可以这样做:
local interface = dofile("input.idl")
并且 interface 将是一个很好的表,就像您在文件中指定它一样。如果您无法根据自己的喜好更改这些文件,则必须将文件加载到字符串中,执行一些字符串操作(具体而言,将第一个替换为interface
)return
,然后loadstring
改用:
io.input("input.idl")
local input = io.read("*all")
input = string.gsub(input, "^interface", "return") -- ^ marks beginning of string
local f = loadstring(input)
local interface = f()
在这两种情况下,您都会得到:
> require"pl.pretty".dump(interface)
{
name = "myInterface",
methods = {
testing = {
args = {
{
type = "double",
direction = "in"
}
},
resulttype = "double"
}
}
}
> print(interface.methods.testing.args[1].type)
double
编辑:
我刚刚意识到,在您的示例中,输入myInterface
没有包含在"
其中,因此不是正确的字符串。这也是您的输入文件中的一个错误,还是您的文件实际上是这样的?在后一种情况下,您也需要更改它。如果它是一个不知道的名字,Lua 不会抱怨,但在这种情况下你也不会得到这个字段。