Oop Lua中的面向对象编程问题
我创建了一个渲染Lua文件,并创建了多个对象,我复制了该文件的一个小片段。这就是我遇到问题的对象(类)。创建Oop Lua中的面向对象编程问题,oop,lua,Oop,Lua,我创建了一个渲染Lua文件,并创建了多个对象,我复制了该文件的一个小片段。这就是我遇到问题的对象(类)。创建newBox函数时,调用函数registerBox()时,this:show()会导致框中的错误:show()。尝试呼叫nil 然而,我对语法进行了一些研究(将一行延伸到多行,以确定是哪一行导致了错误),我知道函数没有导致调用nil,这是this.x或任何this。我没有正确地传递变量吗?请记住,这只是一个片段,所有调用的函数都被省略了,因此我不必发布750行代码 此外,我还对一些事情进行
newBox
函数时,调用函数registerBox()
时,this:show()会导致框中的错误:show()
。尝试呼叫nil
然而,我对语法进行了一些研究(将一行延伸到多行,以确定是哪一行导致了错误),我知道函数没有导致调用nil
,这是this.x
或任何this。
我没有正确地传递变量吗?请记住,这只是一个片段,所有调用的函数都被省略了,因此我不必发布750行代码
此外,我还对一些事情进行了评论,以帮助您进一步理解我的意思,因此您不需要逐行阅读所有代码
-- Box Class
function newBox(x,y,z,w,h,t,b,c)
local this = setmetatable({}, Box)
this.x = x
this.y = y
this.z = z
this.w = w
this.h = h
this.t = t
this.b = b
this.c = c
this:show()
this.v = true
return this
end
当创建一个新对象时,例如localobj=newBox(…)
这将渲染长方体,不用担心,一切正常
function Box:move(x,y,z)
this:hide()
this.x = x
this.y = y
if z then
this.z = z
end
this:show()
end
function Box:resize(w,h)
this:hide()
this.w = w
this.h = h
this:show()
end
function Box:pattern(t,b,c)
this:hide()
this.t = t
this.b = b
this.c = c
this:show()
end
上面的代码不应该有任何问题,应该
function Box:show()
registerBox(this.x,this.y,this.z,this.w,this.h,this.t,this.b,this.c) -- CALL NIL ERROR
this.v = true
this:render()
end
创建对象时调用上述函数>this:show()
它不是RegisterBox
函数,而是实际的this.[var]
参数。
下面是代码的其余部分。但不确定下面的代码是否导致任何问题
function Box:hide()
unregisterBox(this.x,this.y,this.z,this.w,this.h)
this.v = false
this:render()
end
function Box:getPosition()
return this.x,this.y,this.z
end
function Box:getPattern()
return this.t,this.b,this.c
end
function Box:getSize()
return this.w,this.h
end
function Box:destroy()
this:hide()
this = nil
end
正如@user1095108所说,lua中没有this,hidden,这类参数被称为
self
所有类似OOP的机制都有详细的描述,尝试使用简单的示例,为了理解,它是如何工作的,非常简单。简而言之,冒号是函数声明或调用时额外参数的语法糖。Param被称为self,它是一个对象,位于函数调用的左侧。对它的引用被传递给函数
这也没用
function Box:destroy()
this:hide()
this = nil -- Here you assign nil to local variable, passed as parameter.
end
若你们想释放一些对象,你们应该确保对它的所有引用都是未引用的,包括来自调用者的一个对象。参数将自动释放,因为它们是
local
请尝试使用self
而不是this
。出现nil错误正是因为您使用了this
。用self
搜索并替换每个this
,您应该没事了。编辑:@Seagull,它是--
,而不是/
;)哦,好吧,我认为变量不重要,而且我在同一个文件中有多个对象(类),自变量不会与其他对象冲突,因为它是局部变量?@user3214283是的。self是局部的,并且隐式声明为函数第一个参数。它还将遮蔽所有其他全局自变量。@HenrikIlgen ooops。谢谢我的生活中有太多类似C的语言;)
function Box:destroy()
this:hide()
this = nil -- Here you assign nil to local variable, passed as parameter.
end