最近看了个HS的时间显示的例子,顺便学习了一下这个lua定义函数的方法,被折腾了许久,最后竟然是gpt解答了。
定义方式
-- 定义一个对象
local myObject = {isVisible = false,
}-- 定义对象的方法
function myObject:toggleShow()self.isVisible = not self.isVisibleif self.isVisible thenprint("Object is now visible")elseprint("Object is now hidden")end
end-- 调用对象方法
myObject:toggleShow() -- 第一次调用,将显示 "Object is now visible"
myObject:toggleShow() -- 第二次调用,将显示 "Object is now hidden"
在这个示例中,我们定义了一个名为 myObject 的对象,它有一个布尔属性 isVisible,初始值为 false。然后,我们使用 function obj:toggleShow() 语法定义了 toggleShow 方法,它会切换 isVisible 属性的值,并根据该值打印相应的消息。
调用对象方法时,我们使用了 : 运算符,它会自动传递对象本身作为第一个参数给方法。因此,myObject:toggleShow() 实际上等同于 myObject.toggleShow(myObject),这样方法内部就可以使用 self 关键字来访问对象的属性和方法。
应用:显示日期
local obj={}
obj.__index = obj
print("obj is:",obj)function obj:init()obj.canvas = hs.canvas.new({x=0, y=0, w=0, h=0}):show()obj.canvas[1] = {type = "rectangle",action = "fill",fillColor = {hex="#000000", alpha=0.75}}obj.canvas[2] = {type = "text",text = "",textSize = 120,textAlignment = "center",}endfunction obj:toggleShow()if obj.timer thenobj.timer:stop()obj.timer = nilobj.canvas:hide()elselocal time = os.date("%H:%M\n%A\n%Y-%m-%d")local cscreen = hs.screen.mainScreen()local cres = cscreen:fullFrame()obj.canvas:frame({x = cres.x+cres.w*0.15/2,y = cres.y+cres.h*0.30/2,w = cres.w*0.85,h = cres.h*0.50})obj.canvas[2].text = timeobj.canvas:show()obj.timer = hs.timer.doAfter(2, function()obj.canvas:hide()obj.timer = nilend)end
endobj:init()hs.hotkey.bind({"alt"}, "t", function() obj.toggleShow(obj) end)print("now obj:", obj)return obj