Lua 打印变量

最近有点小忙, 主要是在学习和使用mojo, 想用它实现新需求的一部分功能. 最大的感触是: 要把一个框架, 工具, 系统很好地运用到具体的功能时, 需要花费大量时间和精力在理解框架的原理以及细节上面. 一旦到了这个层面, 就势必需要翻看源码, 不能只是阅读文档了…

扯地有点远, 最近因为一直在写Lua代码, 代码也写的有点长了, 变量也有点多, 逻辑也比较复杂, 因此需要花很多时间在调试上面. 对于调试, 本人还是最喜欢print调试法;) 由于Lua中最灵活的数据结构是table, 但是没有现成的打印table的方法, 于是上google搜了一下, 在lua-users上发现打印一个table有许多方法, 请猛击这里. 另外stackoverflow上的这个问答也很不错.

因为自己的需求比较简单, 只是想把Lua变量输出到终端而已, 上面链接给出的例子都稍微重了一点. 再加上用惯了perl中超好用的DDP模块, 因此就想要不就自己写一个简单的方法吧;)

于是就有了下面这段代码, 实现的比较简单, 就是将不同类型的变量按不同颜色输出它的值. 这里还遇到个小插曲, 就是按颜色输出无法使用普通的\e或者\033来进行输出. 竟然在openresty的讨论组里找到了相应的解决办法, orz. 这个原因是在lua中\nnn是按照十进制来解释的, 因此改成\27就好了. OK, 下面直接就是简单的代码:

(ddp.lua) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
local M = {}

local color = {
    r = "\27[1;31m",
    g = "\27[1;32m",
    y = "\27[1;33m",
    b = "\27[1;34m",
    p = "\27[1;35m"
}

-- type to color
local ttc = {
    ['nil']      = 'r',
    ['boolean']  = 'y',
    ['number']   = 'g',
    ['string']   = 'b',
    ['function'] = 'p'
}

local cn = "\27[0m"

--- print the indent
local function pi(indent)
    io.write(string.rep("  ", indent))
end

--- print next line
local function pl()
    io.write("\n")
end

--- print the variable
local function pv(var, c)
    if c and color[c] then
        io.write(color[c] .. tostring(var) .. cn)
    else
        io.write(tostring(var))
    end
end

--- print the table
local function pt(var, indent)
    pv('{'); pl()

    for k, v in pairs(var) do
        pi(indent + 1); pv('['); pv(k, ttc[type(k)]); pv(']   ')

        local t = type(v)
        if t == 'table' then
            pt(v, indent + 1)
        else
            pv(v, ttc[t]); pl()
        end
    end

    pi(indent); pv('}'); pl()
end

function M.p(var)
    local t = type(var)

    if t == 'table' then
        pt(var, 0)
    else
        pv(var, ttc[t]); pl()
    end
end

return M

使用也相当简单;)

usage (d.lua) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
local ddp = require 'ddp'

ddp.p(1)

t = {
    1, 2, 3
}

ddp.p(t)

t = {
    k1 = "v1",
    k2 = "v2",
    k3 = "v3"
}

ddp.p(t)

t = {
    k1 = "v1",
    k2 = "v2",
    s1 = {
        1,2,3
    }
}

ddp.p(t)

t = {
    'helloworld',
    hello = 'world',
    sub = {
        1, 2, 3
    },
    subsub = {
        123,
        123,
        haha = {
            123,
            123
        }
    }
}

ddp.p(t)

ddp.p(ddp)

试了下, 效果也还ok, 还有很多地方可以优化;)

PPPPSSSS

最近发现了gimp这款神器, 真心给力. 我要开始学习P图了~

Comments