@Macgluk

Lua: attempt to index nil value или проблемы с таблицами?

Доброго времени суток.
Уже достаточно долгое время мучаюсь с небольшим куском кода. После изучения всяческих способов реализации ООП в луа, решил попробовать сделать его своими силами. И, фактически, все работает, но не так, как мне хотелось бы.

Тут мы раскладываем объекты по какой-то карте, при этом, каждый объект создается для каждой ячейки и индивидуален.
function map_lay()
	for y = 1, map_w do
		for x = 1, map_h do
			local f = NEW(floor) --Создаем новый объект. 
			f.x = x * f.w -- Вот тут выдает ошибку attempt to index local "f" (nil value)
			f.y = y * f.h
			map[x][y] = f
			end
		end
	end


Вот тут и сам процесс создания.
function NEW(p) --Определяем тип и сортируем в таблицы для удобной работы с объектами. Ну и да, сама функция создает объект.
		o = {}
		o.Parent = p.name --На самом деле, я начал проверку отсюда сразу, как только выдало ошибку. Ребенок и правда рождается мертвым, а именно - nil
		
					--Если у объекта есть родитель, передаем ребенка по назначению при помощи метатаблицы. 
		if o.Parent == nil then
				do end
			else
				function o.Parent:newCreate(o)
					setmetatable(o, {__index = o.Parent})
				end
			end
		
		if o.Type == "tile" then
			table.insert(Turfs, o)
			o.id = math.random(1, 999999) -- На скорую руку для проверки количества объектов в действительности, а не просто #Turfs, где все объекты вполне могут быть одним единственным.
                end

			
			
		created(o) -- Если создан, выполняется код из функции. Например, отрисовка или логирование.
		return o
			
end end


Сами объекты, чьи, грубо говоря, шаблоны используются в массовом создании.
tile = {
		name = tile,
		w = 32,
		h = 32,
		x = 0,
		y = 0,
		Type = "tile",
		Parent,
		id
	}

	 --Интересный момент. Если это объявить вместо local f = NEW(floor), получается ровно то, что я и хотел, и все работает (То самое "фактически"). Ну, точнее, если еще и объявлять локально.
	floor = { 
		name = floor,
		w = 32,
		h = 32,
		x = 0,
		y = 0,
		Type = "tile",
		Parent = tile
		}

В общем, никак не могу понять, что я делаю не так. Испробовал различные варианты, пытался переписывать, но в итоге nil и все тут. Словно функция NEW() вовсе и не получает никаких таблиц. Вполне может быть, что косяк в какой-нибудь мелочи. У меня так часто бывает.
Пожалуйста, объясните где ошибка и, желательно, почему так происходит? А то который час сижу и пытаюсь понять в чем суть. Уже аж мозги сварились.
Извиняюсь, если подобные вопросы были. Искал, но что-то не нашел.
  • Вопрос задан
  • 3271 просмотр
Пригласить эксперта
Ответы на вопрос 1
mva
@mva
CEO, CTO, Lua/Gentoo/IPv6 Pioneer
Для начала, попробуйте объявить o в NEW локально, а не глобально.
Ну и, если честно, недостаточно кода для тестирования :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы