lua:如何将我的函数绑定到io库

时间:2015-05-29 02:36:14

标签: lua

我编写了一个lua函数 write_json ,它将lua表转换为json文本。 是否可以将函数与io库绑定,以便我可以像这样使用它:

    mytable = {name="Jack", age="22", score=[12,33,55,66]}

    f = io.open("score.json", "wb")
    f:write_json(mytable) -- call my function here.
    f:close()

2 个答案:

答案 0 :(得分:3)

您需要访问文件对象的metatable的__index表并将新方法放在那里:

local metatable = getmetatable( io.stdout )
local indextable = metatable.__index
indextable.write_json = function( file, tab )
  -- ...
end

还有另一种方法:C API函数luaL_newmetatable将文件对象的元表存储在密钥"FILE*"下的注册表中,因此以下内容也可以工作(但需要调试库): / p>

local metatable = debug.getregistry()["FILE*"]
local indextable = metatable.__index
-- ...

还有另一种(更为hackish)方式:我测试的所有Lua版本(PUC-Rio Lua 5.1,5.2,5.3和LuaJIT)将metatable的__index字段设置为metatable本身,所以你可以像这样进入__index表:

local indextable = io.stdout.__index

最好的方法可能是第一种方式。

答案 1 :(得分:0)

io.open返回的对象类型为userdata,由于其独特的性质,我认为不能进行猴子修补。