Lua印刷table実装タイプpythonのreprをtableに使用

1717 ワード

luaのインタラクティブな環境では、タイプtableの変数を入力しても、変数の内容が表示されないなんて、ipythonより体験が悪いのはほんの少しではありません.Googleとbingも使いやすい車輪を見つけられず、自分で作った.
-- utils.lua
utils = {}

function utils.is_empty(tab)
    return not tab or next(tab) == nil
end


function repr(tab,...)
    local i, s, is_list, is_nest = 1, '', true, select('#', ...)
    local pre, sep = '    ', '
' if is_nest ~= 0 then pre, sep = '', ' ' end for k,v in pairs(tab) do if i > 5 then s = s..','..sep..pre..'...' break end if i ~= 1 then s = s..',' end s = s..sep..pre if k ~= i then is_list = false s = s..'"'..k..'": ' end value_type = type(v) if value_type == 'string' then v = '"'..v..'"' elseif value_type == 'table' then v = repr(v, 1) end s = s..v i = i + 1 end if is_list then s = '['..s..sep..']' else s = '{'..s..sep..'}' end return s end utils.repr = repr return utils

Usage::
$ lua
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> require('utils')
table: 0x7ff4e15009f0
> repr = utils.repr
> a = {1, 2, 3}
> repr(a)
[
    1,
    2,
    3
]
> b = {a=1, b=2, c=3}
> repr(b)
{
    "a": 1,
    "b": 2,
    "c": 3
}
> c = {
    {a=1},{b=2},{c=3}}
> repr(c)
[
    { "a": 1 },
    { "b": 2 },
    { "c": 3 }
]
>