Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

магия возвращаемых значений

мама чому я です Ученик (96), открыт 3 недели назад
пишу на lua, игровой движок defold. Через функции возвращаю таблицу тайлов, чтобы синхронизировать состояние реальной тайловой карты и ее копий, для этого я присваиваю таблицам возвращаемые значения функций, как тут
 	if action_id == hash("btn_left") and current_tile == 0 then 
Level.plan.tiles = new_tile(Level.plan, tile_x, tile_y)
elseif action_id == hash("btn_right") and current_tile ~= 0 then
Level.main.tiles = remove_tile(Level.main, tile_x, tile_y)
end
Но как оказалось, этого даже не надо! Таблицы синхронизируются, даже если я просто прописываю new_tile(Level.plan, tile_x, tile_y) БЕЗ присваивания. Что за магия такая, зачем я вообще делал ретурны? Как это работает?
 local function new_tile(map, x, y) 
if not set_autotile(map, x, y) then return map.tiles end

map.tiles[y][x] = tilemap.get_tile(map.path, hash(map.layer), x, y)
map.tiles = update_neighbors(map, x, y)

return map.tiles
end
 local Level = { 
main = {
tiles = {},
width,
height,
layer = "walls",
path = "#tilemap"
},
plan = {
tiles = {},
width,
height,
layer = "walls",
path = "#plan_tilemap"
}
}
2 ответа
Света Соинова Профи (926) 3 недели назад
ну смотри функции в lua возвращают таблицу и если ты вызываешь new_tile(Level.plan tile_x tile_y) таблица мутируется прямо там в оригинале вот и синхронизируется без присваивания вот такая магия ссылок а ретурн для копий и нового объекта нужен чтоб не путать оригинал с изменённым
Марья Костяшина Мастер (1535) 3 недели назад
lua таблицы по ссылке передаются значит изменил в функции изменится и снаружи вот и вся магия
Похожие вопросы