发布于 2016-10-10 13:05:21 | 204 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的Lua教程,程序狗速度看过来!

Lua 脚本语言

Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。


会PHP的人都知道PHP中的print_r/var_export函数,可以方便的用于打印数组或导出变量,Lua中没有提供,实际应用中却是很多时候需要类似的功能。

今天便封装了个简单函数,实现类似功能,用来打印/导出table:

-- dump.lua

--[[
dump对象
@param mixed obj
@return string
]]
function debug.dump(obj)
    local getIndent, quoteStr, wrapKey, wrapVal, dumpObj
    getIndent = function(level)
        return string.rep("t", level)
    end
    quoteStr = function(str)
        str = string.gsub(str, "[%c\"]", {
            ["t"] = "\t",
            ["r"] = "\r",
            ["n"] = "\n",
            ["""] = "\"",
            ["\"] = "\\",
        })
        return ‘"‘ .. str .. ‘"‘
    end
    wrapKey = function(val)
        if type(val) == "number" then
            return "[" .. val .. "]"
        elseif type(val) == "string" then
            return "[" .. quoteStr(val) .. "]"
        else
            return "[" .. tostring(val) .. "]"
        end
    end
    wrapVal = function(val, level)
        if type(val) == "table" then
            return dumpObj(val, level)
        elseif type(val) == "number" then
            return val
        elseif type(val) == "string" then
            return quoteStr(val)
        else
            return tostring(val)
        end
    end
    dumpObj = function(obj, level)
        if type(obj) ~= "table" then
            return wrapVal(obj)
        end
        level = level + 1
        local tokens = {}
        tokens[#tokens + 1] = "{"
        for k, v in pairs(obj) do
            tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. ","
        end
        tokens[#tokens + 1] = getIndent(level - 1) .. "}"
        return table.concat(tokens, "n")
    end
    return dumpObj(obj, 0)
end

测试代码:

-- test.lua

local obj = {
    string1 = "Hi! My name is LiXianlin",
    string2 = "aatbbrccndd\ee"ff",
    string3 = "a\tb\rc\n\\ee"ff",
    int = 9527,
    float = 3.1415,
    bool = true,
    table = {
        1, 2, 3,
        {
            a = 21,
            b = 22,
            c = 23,
        },
    },
    [88] = 88888,
    [9.7] = 22222,
}
print(debug.dump(obj)

输出结果:

{
        ["string1"] = "Hi! My name is LiXianlin",
        [9.7] = 22222,
        ["table"] = {
                [1] = 1,
                [2] = 2,
                [3] = 3,
                [4] = {
                        ["b"] = 22,
                        ["a"] = 21,
                        ["c"] = 23,
                },
        },
        ["float"] = 3.1415,
        ["int"] = 9527,
        ["string3"] = "a\tb\rc\n\\ee"ff",
        ["bool"] = true,
        ["string2"] = "aatbbrccndd\ee"ff",
        [88] = 88888,
}

函数特点:

1、理论上支持无限级table嵌套

2、格式化输出,可读性好

3、输出结果可直接用于lua代码

4、function、userdata、thread类型tostring输出

5、当字符串中含有控制字符时,可能有影响(代码中仅对t,r,n等进行了处理)



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务