Как использовать OO в Lua Corona Labs? Невозможно проиндексировать ошибку - PullRequest
0 голосов
/ 13 января 2020

Я использую Corona SDK для разработки игр и создал новый проект, который идет с основным файлом. lua, но хотел добавить другие отдельные файлы, такие как player. lua, чтобы я мог делать объектно-ориентированные.

Моя цель - создать игрока из основного состава, и я провел некоторое исследование о том, как это можно сделать.
ссылка на lua учебник

Вот мой код для этих файлов:

player. lua:

Player = {}

Player.new = function(name, id)

    local self = {}
    name = name or "player"
    id = id or 0

    self.getName = function() return name end
    self.getId = function() return id end

    end
return self

main. lua:

local Player = require("scripts.player")

player1 = Player.new("Player1", 1)
print(player1.getName())

Я ожидаю печать в консоли. В сообщении об ошибке «невозможно индексировать трассировку стека локального проигрывателя (логическое значение)» в main. lua

Ответы [ 2 ]

3 голосов
/ 13 января 2020

Вы не возвращаете проигрыватель lib в player.lua. поэтому, когда вы вызываете

local Player = require("scripts.player")

, вы затеняете глобальную переменную Player, созданную в player.lua, с результатом require, равным true.

Ссылки по требованию: https://www.lua.org/manual/5.3/manual.html#6 .3


У вас есть 2 варианта решения этой проблемы.

Вариант 1) изменить player.lua

local Player = {}

Player.new = function(name, id)

    local self = {}
    name = name or "player"
    id = id or 0

    self.getName = function() return name end
    self.getId = function() return id end

    return self
end

return Player

ИЛИ Вариант 2) Изменить main.lua

require("scripts.player")

player1 = Player.new("Player1", 1)
print(player1.getName())

Вариант один следует за более современным Lua условные обозначения модуля, но любой из вариантов решит вашу проблему.

1 голос
/ 13 января 2020

Первая проблема заключается в том, что у вас есть инструкция возврата для конструктора в неправильном месте. Он должен быть внутри конструктора, а не снаружи:

Player = {}

Player.new = function(name, id)
    local self = {}
    name = name or "player"
    id = id or 0

    self.getName = function() return name end
    self.getId = function() return id end

    return self
end

Последовательный отступ в коде поможет сразу увидеть такие проблемы. Я предлагаю всегда иметь отступ end на том же уровне, что и при открытии блока (независимо от того, является ли он function, for, do или любым другим).

После решения этого проблема у вас есть проблема, упомянутая Nifim - вам нужно позаботиться о затенении Player. Простейшим решением было бы добавить оператор возврата в конец player. lua:

Player = {}

-- `Player.new` and so on...

return Player

Вы также можете сделать Player локальным, если хотите. Это не нужно, но может быть желательно.

Или Вы можете удалить назначение из main. lua:

require("scripts.player")
local player = Player.new()
...