如何将我的函数绑定到io库 in Lua?

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

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

    f = io.open("score.json", "wb")
    f:write_json(mytable) -- 在此处调用我的函数。
    f:close()
点赞
用户4085153
用户4085153

io.open 函数返回的对象类型为 userdata,由于其独特的性质,我相信它无法被猴子补丁(monkey-patch)。

2015-05-29 02:41:39
用户3677376
用户3677376

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

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

还有另一种方法: C API函数luaL_newmetatable将文件对象的元表存储在注册表中,键为"FILE*",因此以下内容也适用(但需要调试库):

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

还有另一种(更“ hackish”)方法:我测试过的所有Lua版本(PUC-Rio Lua 5.1、5.2、5.3和LuaJIT)将元表的__index字段设置为元表本身,因此您可以这样获取__index表:

local indextable = io.stdout.__index

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

2015-05-29 07:29:22