0

I have created a render Lua file, and created multiple objects, I have copied a small snippet of the file. This is the Object (class) that I am having issues with. When the newBox function is created the this:show() is causing the error in the Box:show() when the function registerBox() is called. An attempt to call nil

However I have played around with the syntax a bit (stretching one line into multiple lines to figure what part of the line is causing the error) I know for a fact that the function is not causing the attempt to call nil, it is the this.x or any of the this.<var> Am I not passing the variables correctly? Remember this is only a snippet, all of the functions called are left out so I don't have to post 750 lines of code.

Also I have commented on a few things to help you understand what I mean a little more, and so you don't need to read all of the code line by line as much.

-- 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

This is called when a new object is created for example local obj = newBox( ... )

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

This renders the box, don't worry this is all working fine...

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

The code above should not have any issues, SHOULD...

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

The function above is called when the object is created > this:show() it is NOT the RegisterBox function it is the actual this.[var] parameters. Below is the rest of the code. not sure if the code below is causing any issues though.

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
1
  • 4
    try using self instead of this. Commented Jan 30, 2014 at 10:29

1 Answer 1

1

As @user1095108 say, there is no this in lua, hidden, this-like, parameter is called self

All OOP-like mechanic is greatly described here, try to play with easy examples, to understood, how it works, it's pretty easy. Shortly, colon is a syntax sugar for extra param at function declaration, or call time. Param is called self, and it's an object, at left part of function call. Reference to it is passed to function.

Also it useless to do

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

If you wanna free some object, you should ensure, that all references to it are unreferenced, including an object from caller. Arguments will be free automatically, cause they are local

Sign up to request clarification or add additional context in comments.

4 Comments

The nil error occurs exactly because you used this. Search & replace every this with self and you should be fine. edit: @Seagull, it's --, not // ;)
oh ok, i thought the variables did not matter, also i have multiple object (classes) in the same file, the self variable wont conflict with others because it is local right?
@user3214283 Yes. self is local, and implictly declared as function first argument. It will shadow all other global self variables as well.
@HenrikIlgen ooops. Thanks! There is too much C-like languages in my life ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.