# 【Lua Snippet】简化Bang的写法 - Rainmeter插件与测试 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 11484|回复: 47

[插件与脚本] 【Lua Snippet】简化Bang的写法

[复制链接]

签到天数: 78 天

[LV.6]常住居民II

发表于 2014-4-3 09:17:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 suixin812 于 2014-5-6 11:28 编辑

script.jpg

一般我们在Lua里要发送一个Bang指令时,通常使用SKIN对象的Bang()函数。例如设置一个Meter的选项并更新:
  1. SKIN:Bang('!SetOption','Label','Text',s)
复制代码
有时候要写很多个Bang的时候会觉得这种写法格外麻烦,
虽然我们也可以把所有Bang一次性传递给Bang函数
  1. SKIN:Bang('[!SetOption Label Text'..s..'][!Update]')
复制代码
但像这样需要传递Lua里变量的时候,这么写也很麻烦。
所以一般我们会声明一个简单的函数,来简化Bang函数:
  1. function SetOpt(section,key,value)
  2.               return SKIN:Bang('!SetOption', section, key, value)
  3. end
复制代码
但最近我发现另一种简化Bang写法的办法,我们可以直接在表MeterWindow里声明新的函数:

  1. function MeterWindow:SetOption(section,key,value)
  2.         return self:Bang('!SetOption',section,key,value)
  3. end
复制代码
MeterWindow是SKIN对象的类,这样我们就可以这样使用Bang:
  1. SKIN:SetOption('Label','Text',s)
复制代码
虽然字数变多了,但是好处是比之前的函数好记。
用之前的方法在全局声明一个新的函数,等过几天后回来很可能你就已经忘了SetOption改用什么函数。
另一个好处是,只要有一个这样声明了函数的一个lua被加载,那么Rainmeter中所有的lua都可以用SKIN:SetOption()的写法。

最后,下面这个函数声明了一些常用的Bang,只要在脚本加载时执行一下就可以了

  1. --简化SKIN:Bang的写法
  2. function SimplyBangs()
  3.         local bangs = {
  4.                 'SetOption',
  5.                 'SetVariable',
  6.                 'CommandMeasure',
  7.                 'Redraw',
  8.                 'Update',
  9.                 'UpdateMeter',
  10.                 'UpdateMeasure',
  11.                 'EnableMeasure',
  12.                 'DisableMeasure',
  13.                 'MoveMeter',
  14.                 'HideMeter',
  15.                 'ShowMeter',
  16.                 'Log'
  17.         }
  18.         
  19.         for _, b in pairs(bangs) do
  20.                 MeterWindow[b] = MeterWindow[b] or function(self, ...)
  21.                         return MeterWindow.Bang(self,'!'..b,unpack(arg))
  22.                 end
  23.         end
  24. end
复制代码

本帖被以下淘专辑推荐:

回复

使用道具 举报

该用户从未签到

发表于 2018-8-15 00:37:42 | 显示全部楼层
但像这样需要传递Lua里变量的时候
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 23:35:06 | 显示全部楼层
通常使用SKIN对象的Bang()函数
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 22:32:12 | 显示全部楼层
我是看到封面点进来的
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 21:29:42 | 显示全部楼层
--简化SKIN:Bang的写法
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 20:26:37 | 显示全部楼层
虽然字数变多了
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 19:23:52 | 显示全部楼层

? ?? ?? ?? ?? ? MeterWindow[b] = MeterWindow[b] or function(self, ...)
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 17:18:23 | 显示全部楼层

? ?? ?? ?? ?? ? 'DisableMeasure',
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 16:15:36 | 显示全部楼层

? ?? ?? ?? ???return SKIN:Bang('!SetOption', section, key, value)
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 15:12:50 | 显示全部楼层
? ?? ???local bangs = {
回复

使用道具 举报

该用户从未签到

发表于 2018-8-14 14:10:04 | 显示全部楼层
另一个好处是
回复

使用道具 举报

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

本版积分规则

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