Zulukas
Zulukas

Reputation: 1290

Lua attempt to call method a nil value

I'm lost on what I'm doing wrong here.

I have this simple code:

Queue = {}
Queue.__Index = Queue

function Queue.Create()
    local obj = {}
    setmetatable(obj, Queue)
    return obj
end

function Queue:PushBack(item)
end

q = Queue.Create()
print(q)
q:PushBack(1)

When executing this I get "attempt to call method 'PushBack' (a nil value). However, if I change the PushBack function like this and call it accordingly it works:

function Queue.PushBack(q, item)
end

q = Queue.Create()
print(q)
Queue.PushBack(q, 1)

The code runs and executes correctly. I understand that ":" is syntactic sugar, so it seems to me that

function Queue:PushBack(item)

would be exactly the same as

Queue.PushBack(q, item)

But it dies on me. Does it have to do with how I'm creating the object? I'm pretty lost on this and I can't seem to figure out what exactly is wrong.

Upvotes: 3

Views: 23886

Answers (1)

Unheilig
Unheilig

Reputation: 16302

The nil signifies that the PushBack function is not found in the first case.

The reason your code doesn't work, is because you have unintentionally misspelt __Index as it should be:

Queue.__index = Queue

with i of __index being lower-case.

Once corrected, your code should work.

Upvotes: 5

Related Questions