Lua中面向对象编程的问题

时间:2014-01-30 10:21:47

标签: oop lua

我创建了一个渲染Lua文件,并创建了多个对象,我复制了一小段文件。这是我遇到问题的Object(类)。创建newBox函数时,this:show()在调用函数Box:show()时导致registerBox()中的错误。尝试调用nil

然而,我已经使用了一些语法(将一行拉伸成多行以确定该行的哪一部分导致错误)我知道该函数不会导致尝试调用{{1它是nil或任何this.x我没有正确传递变量吗?请记住,这只是一个片段,所有被调用的函数都被遗漏了,所以我不必发布750行代码。

此外,我已经对一些事情进行了评论,以帮助您理解我的意思,因此您不需要逐行阅读所有代码。

this.<var>

在创建新对象(例如本地-- 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

)时调用此方法
obj = newBox( ... )

这会呈现框,不要担心这一切都正常......

function Box:render()
  rasterBox(this.x,this.y,this.w,this.h)
  renderBox(this.x,this.y,this.w,this.h)  
end

上面的代码应该没有任何问题,应该......

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

创建对象时,将调用上述函数&gt; 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]

1 个答案:

答案 0 :(得分:1)

正如@ user1095108所说,在lua中没有这个,隐藏的,类似这样的参数被称为self

所有类似OOP的机制都被大量描述here,尝试使用简单的例子,理解,它是如何工作的,这很容易。简而言之,冒号是函数声明或调用时间的额外参数的语法糖。 Param被称为self,它是一个对象,在函数调用的左侧。对它的引用传递给函数。

也没用做

function Box:destroy()
  this:hide()
  this = nil -- Here you assign nil to local variable, passed as parameter.
end

如果你想释放一些对象,你应该确保所有对它的引用都是未引用的,包括来自调用者的对象。参数将自动免费,因为它们是local