Ошибка Lua при индексации глобального значения nil - PullRequest
2 голосов
/ 31 марта 2019

Для игры с использованием CoronaSDK я пытаюсь реализовать некоторые ООП в Lua.

Если я запускаю следующий код в симуляторе Corona:

-- Terrain Sprites base

local TerrBase = {}
local TerrBase_mt = {_index = TerrBase}

function TerrGrass_mt.baseAdd(a,b)
    print(a+b)
end



-- Terrain Sprites - Grass

local TerrGrass = {}

function TerrGrass.new()
    local grass = {}
    setmetatable(grass,TerrBase_mt)
    return grass
end

function TerrGrass.add(a,b)
    print(a+b)
end

function TerrGrass.sub(a,b)
    print(a-b)
end

function TerrGrass.mul(a,b)
    print(a*b)
end

function TerrGrass.div(a,b)
    print(a/b)
end

--

local grass = TerrGrass.new()

grass.add(5,7)

, я получаю это сообщение:

enter image description here

В чем причина этой ошибки?

1 Ответ

1 голос
/ 31 марта 2019
local TerrBase = {}
local TerrBase_mt = {_index = TerrBase}

function TerrGrass_mt.baseAdd(a,b)  -- <---- ERROR
    print(a+b)
end

Вы пытаетесь проиндексировать таблицу с именем TerrGrass_mt.Но определенная вами таблица называется TerrBase_mt.

TerrGrass_mt - это значение nil, следовательно, ошибка.

Давайте посмотрим на сообщение об ошибке:

main.lua 12: попытка индексировать глобальный TerrGrass_mt (значение nil).

Это говорит о том, что ошибка произошла в строке 12 файла main.lua.

Вы попытались проиндексировать (используйте оператор индекса .) для глобального объекта с именем TerrGrass_mt.Это говорит о том, что проблема в TerrGrass_mt. и TerrGrass_mt в ноль.

Что-то вроде

function a(b) c = b.d end
a()

может привести к ошибке при индексации локального значения nil bпотому что здесь область действия b является локальной.

Всякий раз, когда вы получаете ошибку для использования значений nil любым способом, вы должны выяснить, почему значение равно nil, и либо исправить это, либо в некоторых случаях заменить его значением по умолчанию.

...