- UID
- 335199
- 主题
- 注册时间
- 2012-9-25
- 在线时间
- 小时
- 最后登录
- 1970-1-1
签到天数: 78 天 [LV.6]常住居民II
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?点击注册
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实例的全局变量的表
- local gt = { }
- --用来记录_G中所有的表及其键与值
- local fo = io.open('test.txt','w')
- --输出到这个文件
- local unpack_g
- --定义将_G表中的项目记录到gt中的函数
- unpack_g = function (k, v, t, pn)
- if not t or not gt[t] then
- --函数被初次调用时
- --形如unpack_g(_, _G, _, '_G')
- v = v or _G
- t = v
- k = 'nil'
- pn = pn or '_G'
- gt[t] = gt[t] or {}
- gt[t]['name'] = pn or '_G'
- end
- --函数被嵌套调用时
- if type(v) == 'bool' then
- gt[t]['boo'] = gt[t]['boo'] or {}
- gt[t]['boo'][k] = tostring(v)
- elseif type(v) == 'number' then
- gt[t]['num'] = gt[t]['num'] or {}
- gt[t]['num'][k] = v
- elseif type(v) == 'string' then
- gt[t]['str'] = gt[t]['str'] or {}
- gt[t]['str'][k] = ('%q'):format(v:sub(1,20))
- elseif type(v) == 'function' then
- gt[t]['foo'] = gt[t]['foo'] or {}
- gt[t]['foo'][k] = 'function()'
- elseif type(v) == 'userdata' then
- gt[t]['usr'] = gt[t]['usr'] or {}
- gt[t]['usr'][k] = 'userdata'
- elseif type(v) == 'table' then
- gt[t]['tb'] = gt[t]['tb'] or {}
- if gt[v] and k~='nil' then
- --键k指向一个gt已经记录了的表
- --则只记录表的名字
- gt[t]['tb'][k] = gt[v]['name']
- else
- --键k指向一个gt未记录的表
- --或当前为函数的初次调用时
- --则记录这个表及其键与值
- gt[t]['tb'][k] = k~='nil' and '{}' or nil
- if k == 'gt' or (t==_G and type(k) == 'number') then
- --不打印当前定义的gt表
- --不打印_G[1]等表
- return
- end
- gt[v] = gt[v] or {}
- gt[v]['name'] = pn or gt[t]['name']..'['..k..']'
- t = v
- for k, v in pairs(t) do
- unpack_g(k, v, t)
- --嵌套调用unpack_g
- end
- end
- end
- end
- --开始记录,从_G表开始
- unpack_g(_, _G, _, '_G')
- --对项目进行排序
- local gti = {}
- for _, p in pairs(gt) do
- table.insert(gti, p)
- end
- table.sort(gti, function(a,b) return a['name'] < b['name'] end)
- --开始打印
- for _, p in ipairs(gti) do
- fo:write(p['name'], '\t=\t{}\n')
- for _, tp in ipairs{'boo', 'num', 'str', 'foo', 'usr', 'tb'} do
- if p[tp] then
- local ti = {}
- for k, v in pairs(p[tp]) do
- table.insert(ti,{tostring(k), v})
- end
- table.sort(ti, function(a,b) return a[1] < b[1] end)
- for _, sp in ipairs(ti) do
- fo:write(p['name'], '[', sp[1],']\t=\t',sp[2],'\n')
- end
- end
- end
- fo:write('\n')
- end
- fo:close()
- fo = nil
- --清空记录,避免垃圾回收障碍
- gt = nil
- gti = nil
复制代码 其中 gt表的结构为
- gt[_G] = { name = '_G',
- num = {}
- num['num1'] = 1,
- num['num2'] = 2
- str = {}
- foo = {}
- tb
- }
复制代码 下面为打印结果的部分截图
_G
|
评分
-
参与人数 1 | 心动值 +1 |
活跃值 +10 |
技术值 +1 |
收起
理由
|
萝莉头
| + 1 |
+ 10 |
+ 1 |
童鞋我要表扬你( ノ^ω^)ノ |
查看全部评分
|