Oop Lua中的面向对象编程问题

Oop Lua中的面向对象编程问题,oop,lua,Oop,Lua,我创建了一个渲染Lua文件,并创建了多个对象,我复制了该文件的一个小片段。这就是我遇到问题的对象(类)。创建newBox函数时,调用函数registerBox()时,this:show()会导致框中的错误:show()。尝试呼叫nil 然而,我对语法进行了一些研究(将一行延伸到多行,以确定是哪一行导致了错误),我知道函数没有导致调用nil,这是this.x或任何this。我没有正确地传递变量吗?请记住,这只是一个片段,所有调用的函数都被省略了,因此我不必发布750行代码 此外,我还对一些事情进行

我创建了一个渲染Lua文件,并创建了多个对象,我复制了该文件的一个小片段。这就是我遇到问题的对象(类)。创建
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
当创建一个新对象时,例如local
obj=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