Attempt To Call Method ' ' (A Nil Value) - Error... Driving Me Crazy...

Hello everybody! I would ask your help for an error that is driving me crazy.

I am creating an instance of a ship. She is being instantiated, I can access its properties, but I can not access any method!! Follow the codes, I do not know what to do:

spaceShip.lua:

[lua]require(‘gameConf’)

spaceShip = {}
spaceShip.__index = spaceShip

function spaceShip:New(posX, posY, width, height)
local _spaceShip = nil
_spaceShip = {}
setmetatable(_spaceShip, spaceShip)

_spaceShip = display.newRect(posX - width/2, posY - height/2, width, height)
_spaceShip:setFillColor(140, 140, 140, 0)
_spaceShip.width = width
_spaceShip.height = height

local shipShape = { -width/2, -height/2, width/2, -height/2, width/2, height/2, -width/2, height/2 }
local shipShapeMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipShape}

local shipMotor = { -width/2, height/3, width/2, height/3, width/2, height/2, -width/2, height/2 }
local shipMotorMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipMotor}

physics.addBody( _spaceShip, shipShapeMaterial, shipMotorMaterial )

return _spaceShip
end

function spaceShip:log()
print(“ship”)
end

function spaceShip:applyFrontImpulse()
local angle = math.rad(self.rotation)
local xComp, yComp = math.cos(angle), -math.sin(angle)
local forceMag = 2

self:applyLinearImpulse(forceMag * xComp, forceMag * yComp, self.x, self.y)
end[/lua]

main.lua

[lua]require(‘camera’)
require(‘gameConf’)
require(‘meteor’)
require(‘spaceShip’)

– Adiciona a física
local physics = require( “physics” )
physics.start()
physics.setDrawMode( “hybrid” )
physics.setGravity( 0, 0 )

– Carrega a camera
local camera = camera:New()

– Containers
meteorManager = {}
shipManager = {}

– Requisita a classe Vector
vector = require “vector”

– Adiciona uma nave
local myShip = nil;
myShip = {}
myShip = spaceShip:New(600, 200, 30, 60)
table.insert(shipManager, myShip)
camera:insert(myShip)
myShip:log() – ERROR HERE!!!

Rest of the code…[/lua]

And the error in Terminal:

2013-03-21 19:18:15.736 Corona Simulator[48347:707] Runtime error: 

2013-03-21 19:18:15.737 Corona Simulator[48347:707] …t/iOS/Deep Space Harvest/Deep Space Harvest/main.lua:28: attempt to call method ‘log’ (a nil value)

stack traceback:

    [C]: in function ‘log’

    …t/iOS/Deep Space Harvest/Deep Space Harvest/main.lua:28: in main chunk

It’s because your function log() is attached to the class which creates new spaceships, and not the spaceship instance itself. You then try to call the function from the object and get this error.

Try moving 

function spaceShip:log() print("ship") end  

into spaceShip:New(), just before the return and change it from

spaceShip:log()

to

_spaceShip:log()

e.g. like this

function spaceShip:New(posX, posY, width, height) local \_spaceShip = nil \_spaceShip = {} setmetatable(\_spaceShip, spaceShip) \_spaceShip = display.newRect(posX - width/2, posY - height/2, width, height) \_spaceShip:setFillColor(140, 140, 140, 0) \_spaceShip.width = width \_spaceShip.height = height local shipShape = { -width/2, -height/2, width/2, -height/2, width/2, height/2, -width/2, height/2 } local shipShapeMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipShape} local shipMotor = { -width/2, height/3, width/2, height/3, width/2, height/2, -width/2, height/2 } local shipMotorMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipMotor} physics.addBody( \_spaceShip, shipShapeMaterial, shipMotorMaterial )       function \_spaceShip:log()     print("ship") end return \_spaceShip end  

It’s because your function log() is attached to the class which creates new spaceships, and not the spaceship instance itself. You then try to call the function from the object and get this error.

Try moving 

function spaceShip:log() print("ship") end  

into spaceShip:New(), just before the return and change it from

spaceShip:log()

to

_spaceShip:log()

e.g. like this

function spaceShip:New(posX, posY, width, height) local \_spaceShip = nil \_spaceShip = {} setmetatable(\_spaceShip, spaceShip) \_spaceShip = display.newRect(posX - width/2, posY - height/2, width, height) \_spaceShip:setFillColor(140, 140, 140, 0) \_spaceShip.width = width \_spaceShip.height = height local shipShape = { -width/2, -height/2, width/2, -height/2, width/2, height/2, -width/2, height/2 } local shipShapeMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipShape} local shipMotor = { -width/2, height/3, width/2, height/3, width/2, height/2, -width/2, height/2 } local shipMotorMaterial = { density = 1.0, friction = 1.0, bounce = 0.0 , shape = shipMotor} physics.addBody( \_spaceShip, shipShapeMaterial, shipMotorMaterial )       function \_spaceShip:log()     print("ship") end return \_spaceShip end