【Lua Snippet】简化Bang的写法
本帖最后由 suixin812 于 2014-5-6 11:28 编辑一般我们在Lua里要发送一个Bang指令时,通常使用SKIN对象的Bang()函数。例如设置一个Meter的选项并更新:SKIN:Bang('!SetOption','Label','Text',s)有时候要写很多个Bang的时候会觉得这种写法格外麻烦,
虽然我们也可以把所有Bang一次性传递给Bang函数SKIN:Bang('[!SetOption Label Text'..s..'][!Update]')但像这样需要传递Lua里变量的时候,这么写也很麻烦。
所以一般我们会声明一个简单的函数,来简化Bang函数:function SetOpt(section,key,value)
return SKIN:Bang('!SetOption', section, key, value)
end但最近我发现另一种简化Bang写法的办法,我们可以直接在表MeterWindow里声明新的函数:
function MeterWindow:SetOption(section,key,value)
return self:Bang('!SetOption',section,key,value)
end
MeterWindow是SKIN对象的类,这样我们就可以这样使用Bang:SKIN:SetOption('Label','Text',s)虽然字数变多了,但是好处是比之前的函数好记。
用之前的方法在全局声明一个新的函数,等过几天后回来很可能你就已经忘了SetOption改用什么函数。
另一个好处是,只要有一个这样声明了函数的一个lua被加载,那么Rainmeter中所有的lua都可以用SKIN:SetOption()的写法。
最后,下面这个函数声明了一些常用的Bang,只要在脚本加载时执行一下就可以了
--简化SKIN:Bang的写法
function SimplyBangs()
local bangs = {
'SetOption',
'SetVariable',
'CommandMeasure',
'Redraw',
'Update',
'UpdateMeter',
'UpdateMeasure',
'EnableMeasure',
'DisableMeasure',
'MoveMeter',
'HideMeter',
'ShowMeter',
'Log'
}
for _, b in pairs(bangs) do
MeterWindow = MeterWindow or function(self, ...)
return MeterWindow.Bang(self,'!'..b,unpack(arg))
end
end
end 但像这样需要传递Lua里变量的时候 通常使用SKIN对象的Bang()函数 我是看到封面点进来的 --简化SKIN:Bang的写法 虽然字数变多了
? ?? ?? ?? ?? ? MeterWindow = MeterWindow or function(self, ...)
? ?? ?? ?? ?? ? 'DisableMeasure',
? ?? ?? ?? ???return SKIN:Bang('!SetOption', section, key, value) ? ?? ???local bangs = { 另一个好处是