# 【Lua Snippet】打印_G表 - Rainmeter插件与测试 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 9065|回复: 35

[插件与脚本] 【Lua Snippet】打印_G表

[复制链接]

签到天数: 78 天

[LV.6]常住居民II

发表于 2014-5-6 11:26:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?点击注册

x
本帖最后由 suixin812 于 2019-11-3 15:14 编辑

Rainmeter 4.0beta r2620
Lua scripting: Corrected an issue where anything defined in the Initialize() function of a Lua script was treated as "global" across all skins using Lua, which could cause "bleeding" of defined variables between skins, or between script measures in a single skin. Each Lua measure will now run in an entirely separate local context.


r2620版本后,不同皮肤和Measure不再共用一个_G表。
无法再通过_G[1]的方式指向另一个Lua Measure实例中的全局变量,
也无法再通过_G表来在多个Lua Measure实例中共享数据。

-------------------------------

我们知道Rainmeter的Lua环境与标准的Lua 5.1环境是不同的,
一些库和函数是被禁用的,比如debug库或require函数。
此外Lua本身不同版本之间也存在某些函数的被废弃的情况。所以,我们可以通过打印_G表来了解哪些函数存在,哪些函数不存在
因为_G表里储存了所有全局变量

下面这段代码向Rainmeter的安装目录中的test.txt打印了_G表中的所有内容
这里不包含_G[1]、_G[2]等储存了Lua Measure实例的全局变量的表

  1.         local gt = { }
  2.                 --用来记录_G中所有的表及其键与值
  3.         local fo = io.open('test.txt','w')
  4.                 --输出到这个文件
  5.         local unpack_g
  6.                 --定义将_G表中的项目记录到gt中的函数
  7.         unpack_g = function (k, v, t, pn)
  8.                 if not t or not gt[t] then
  9.                         --函数被初次调用时
  10.                         --形如unpack_g(_, _G, _, '_G')
  11.                         v = v or _G
  12.                         t = v
  13.                         k = 'nil'
  14.                         pn = pn or '_G'
  15.                         gt[t] = gt[t] or {}
  16.                         gt[t]['name'] = pn or '_G'
  17.                 end
  18.                 --函数被嵌套调用时
  19.                 if type(v) == 'bool' then
  20.                         gt[t]['boo'] = gt[t]['boo'] or {}
  21.                         gt[t]['boo'][k] = tostring(v)
  22.                 elseif type(v) == 'number' then
  23.                         gt[t]['num'] = gt[t]['num'] or {}
  24.                         gt[t]['num'][k] = v
  25.                 elseif type(v) == 'string' then
  26.                         gt[t]['str'] = gt[t]['str'] or {}
  27.                         gt[t]['str'][k] = ('%q'):format(v:sub(1,20))
  28.                 elseif type(v) == 'function' then
  29.                         gt[t]['foo'] = gt[t]['foo'] or {}
  30.                         gt[t]['foo'][k] = 'function()'
  31.                 elseif type(v) == 'userdata' then
  32.                         gt[t]['usr'] = gt[t]['usr'] or {}
  33.                         gt[t]['usr'][k] = 'userdata'
  34.                 elseif type(v) == 'table' then
  35.                         gt[t]['tb'] = gt[t]['tb'] or {}
  36.                         if gt[v] and k~='nil' then
  37.                                 --键k指向一个gt已经记录了的表
  38.                                 --则只记录表的名字
  39.                                 gt[t]['tb'][k] = gt[v]['name']
  40.                         else
  41.                                 --键k指向一个gt未记录的表
  42.                                 --或当前为函数的初次调用时
  43.                                 --则记录这个表及其键与值
  44.                                 gt[t]['tb'][k] = k~='nil' and '{}' or nil
  45.                                 if k == 'gt' or (t==_G and type(k) == 'number') then
  46.                                         --不打印当前定义的gt表
  47.                                         --不打印_G[1]等表
  48.                                         return
  49.                                 end
  50.                                 gt[v] = gt[v] or {}
  51.                                 gt[v]['name'] = pn or gt[t]['name']..'['..k..']'
  52.                                 t = v
  53.                                 for k, v in pairs(t) do
  54.                                         unpack_g(k, v, t)
  55.                                                 --嵌套调用unpack_g
  56.                                 end
  57.                         end
  58.                 end
  59.         end
  60.         --开始记录,从_G表开始
  61.         unpack_g(_, _G, _, '_G')
  62.         --对项目进行排序
  63.         local gti = {}
  64.         for _, p in pairs(gt) do
  65.                 table.insert(gti, p)
  66.         end
  67.         table.sort(gti, function(a,b) return a['name'] < b['name'] end)
  68.         --开始打印
  69.         for _, p in ipairs(gti) do
  70.                 fo:write(p['name'], '\t=\t{}\n')
  71.                 for _, tp in ipairs{'boo', 'num', 'str', 'foo', 'usr', 'tb'} do
  72.                         if p[tp] then
  73.                                 local ti = {}
  74.                                 for k, v in pairs(p[tp]) do
  75.                                         table.insert(ti,{tostring(k), v})
  76.                                 end
  77.                                 table.sort(ti, function(a,b) return a[1] < b[1] end)
  78.                                 for _, sp in ipairs(ti) do
  79.                                         fo:write(p['name'], '[', sp[1],']\t=\t',sp[2],'\n')
  80.                                 end
  81.                         end
  82.                 end
  83.                 fo:write('\n')
  84.         end
  85.         fo:close()
  86.         fo = nil
  87.         --清空记录,避免垃圾回收障碍
  88.         gt = nil
  89.         gti = nil
复制代码
其中 gt表的结构为

  1. gt[_G] = {        name = '_G',
  2.                 num = {}
  3.                 num['num1'] = 1,
  4.                 num['num2'] = 2
  5.                 str = {}
  6.                 foo = {}
  7.                 tb
  8.         }
复制代码
下面为打印结果的部分截图

_G

_G





评分

参与人数 1心动值 +1 活跃值 +10 技术值 +1 收起 理由
萝莉头 + 1 + 10 + 1 童鞋我要表扬你( &#65417;^ω^)&#65417;

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

签到天数: 122 天

[LV.7]常住居民III

发表于 2014-5-6 14:29:48 | 显示全部楼层
真牛!有技术的男人充满魅力啊!
回复

使用道具 举报

签到天数: 347 天

[LV.8]以坛为家I

发表于 2014-5-9 17:36:41 | 显示全部楼层
lua,有时间要学习学习
回复

使用道具 举报

签到天数: 121 天

[LV.7]常住居民III

发表于 2014-5-9 22:22:23 | 显示全部楼层
不明觉厉......
回复

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

发表于 2014-5-9 22:31:46 | 显示全部楼层
什么东东
回复

使用道具 举报

签到天数: 131 天

[LV.7]常住居民III

发表于 2014-5-13 10:20:43 | 显示全部楼层
总感觉很犀利的样子
回复

使用道具 举报

z6622388 该用户已被删除
发表于 2015-4-4 14:52:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

签到天数: 21 天

[LV.4]偶尔看看III

发表于 2015-4-21 17:33:17 | 显示全部楼层
好厉害 下载了
回复

使用道具 举报

签到天数: 4 天

[LV.2]偶尔看看I

发表于 2015-5-9 02:46:30 | 显示全部楼层
顶一下顶一下顶一下
回复

使用道具 举报

签到天数: 80 天

[LV.6]常住居民II

发表于 2015-7-4 08:30:08 | 显示全部楼层
感谢楼主分享            
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

快速回复 返回顶部 返回列表