当前位置: 首页 > news >正文

lua实现table转string

table等类型转换成string,转换结果可以直接当作lua代码,传进loadstring执行。

先上代码再解释:

local function fret(...)
    local args = {...}
    return function()
        return unpack(args)
    end
end

function stringify(val)
    return (({
        ["nil"]        = fret "nil",
        ["boolean"]    = fret(tostring(val)),
        ["number"]     = fret(val),
        ["function"]= function()
            return "function(...)"..
                "return loadstring("..
                    stringify(string.dump(val))..
                ")(...)"..
            "end"
        end,
        ["string"]     = function()
            local s = "\""
            for c in val:gfind"." do
                s = s.."\\"..c:byte()
            end
            return s.."\""
        end,
        ["table"] = function()
            local members = {}
            for k,v in pairs(val) do
                table.insert(members,
                    "["..stringify(k).."]="..stringify(v))
            end
            return "{"..table.concat(members,",").."}"
        end,
    })[type(val)] or function() 
        error("cannot stringify type:"..type(val),2) 
    end)()
end

测试如下:

print(stringify"\"")--"
local s = stringify{
    b = false,
    n = 112.222,
    s = "aaaasddd",
    f = function()
        print "hello"
    end,
    f2= function(s)
        return s.."!!!"
    end,
    t = {
        name = "leo",
        age = 18
    }
}
local t = loadstring("return "..s)()
print(t.t.name)--leo
print(t.f2"leo123")--leo123!!!

 

 

说明,fret不是必要的,是我写的一个库里的函数,作用是调用时返回参数。不想用它的话,可以用function() return ... end替换掉。

接口函数是stringify,可以把几乎所有的常用数据转换成字符串。

 

需要说明一下:

  可以转换function,但是function不能有upvalue,否则会失败

  传入的string数据没有任何限制,可以放心的使用转义符、特殊字符、多字节字符等

 

转载于:https://www.cnblogs.com/leosfly/p/7734123.html

相关文章:

  • 毕业设计10-26星期四
  • 洛谷P3469 [POI2008]BLO-Blockade
  • 使用MEMCACHED实现缓存
  • 煤球数目
  • 基本パターン(単一スレッド)
  • css左侧固定宽度,右侧自适应的几种实现方法
  • 可视化查询
  • Alpha 冲刺 (3/10)
  • 用GDB调试程序(一)
  • (转载)深入super,看Python如何解决钻石继承难题
  • 1000. A+B Problem
  • 儿童上网时间管控软件_GreenSurfOnline V0.1 使用说明 (以Windows后台服务形式存在,安装需要有一定电脑操作基础)...
  • 没事儿别优化!
  • Java并发案例04---生产者消费者问题03--使用ReentrantLock
  • Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTTP 简介
  • Invalidate和postInvalidate的区别
  • Python_OOP
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • TypeScript迭代器
  • uva 10370 Above Average
  • 诡异!React stopPropagation失灵
  • 和 || 运算
  • 聚类分析——Kmeans
  • 前嗅ForeSpider采集配置界面介绍
  • 悄悄地说一个bug
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信公众号开发小记——5.python微信红包
  • C# - 为值类型重定义相等性
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 回归生活:清理微信公众号
  • ​queue --- 一个同步的队列类​
  • # Maven错误Error executing Maven
  • #宝哥教你#查看jquery绑定的事件函数
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2)MFC+openGL单文档框架glFrame
  • (2015)JS ES6 必知的十个 特性
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (70min)字节暑假实习二面(已挂)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)深入super,看Python如何解决钻石继承难题
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (转载)虚函数剖析
  • *p++,*(p++),*++p,(*p)++区别?
  • ./和../以及/和~之间的区别
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 将实体类转换为 SQL(ORM 映射)