gpt4 book ai didi

lua - 如何在Lua中将对象作为回调参数传递

转载 作者:行者123 更新时间:2023-12-04 20:25:47 24 4
gpt4 key购买 nike

定义 View 和 ViewGroup类, View 的onDraw可以自定义的方法,遍历ViewGroup中的所有View对象,执行其onDraw方法,并将 Canvas obj 传递给 onDraw方法。

不能在View的onDraw中调用Canvas的方法,不能使用self在View中调用属性,可以保证Canvas obj是正确的。
示例代码如下:

ViewGroup = {    
childcount = 0,
childs = {} -- view object list
}

function ViewGroup:onDraw(canvas)
for i=1,self.childcount do
local childView = self.childs[i]
childView:onDraw(canvas)
end
end


View = {
x = 0,
y = 0,
width = 0,
height = 0,
onDraw = nil
}

function View:new()
local o = {
onDraw = nil
}
setmetatable(o, self)
self.__index = self
return o
end

button1 = View:new()
button1.onDraw = function(canvas)
-- the problem is here, can not call Canvas's method and can not call self.width
canvas:save()
canvas:fillRect(0, 0, self.width, self.height)
canvas:restore()
end

错误提示:
attempt to call a nil value (method 'save')
attempt to index a nil value (global 'self')

最佳答案

您使用点( . )语法声明回调:

button1.onDraw = function(canvas)

但是你用冒号( : )来调用它:
childView:onDraw(canvas)

第二个调用约定意味着第一个传递的参数将是 self ,或者,在您的特定情况下,它相当于:
childView.onDraw(childView, canvas)

要解决此问题,请更改按钮的 onDraw使用 : :
function button1:onDraw(canvas)

或添加 self手动参数,就像 Egor 建议的那样:
button1.onDraw = function(self, canvas)

关于lua - 如何在Lua中将对象作为回调参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48299674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com