Правильное использование таблиц / классов lua - PullRequest
1 голос
/ 21 сентября 2019

Я пытаюсь использовать поведение классов в lua, где есть корабль, у которого есть два других класса pos и vector. Но я не могу заставить его работать так, как я предполагал, что смогу

Point = {x=0, y=0}
function Point:new(p)
  p = p or {}
  return p
end

Ship =
{
  pos = {Point:new{x=0,y=0}},
  vector = {Point:new{x=0,y=0}} -- I thought this would be sufficient for access being available for vector
}

-- create new ship class
function Ship:new(pos)
  p = p or {}
  p.pos = pos
  p.vector = Point:new{x=0,y=0} -- I need to do this or accessing vector will crash (The problem)
  return p
end

-- Create new ship...
plrShip = Ship:new{}
plrShip.pos.x = 300
plrShip.pos.y = 300

Есликто-нибудь знает, как сделать приведенный выше код чище / лучше, я был бы благодарен

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Я нашел решение, чтобы сделать это, оно все еще не идеально, но только я получил работу был этот модифицированный код:

Ship =
{
  pos = Point:new{x=0,y=0},
  vector = Point:new{x=0,y=0}
}

function Ship:new()
  p = p or {}
  p.pos = self.pos
  p.vector = self.vector
  return p
end

plrShip = Ship:new()
plrShip.pos.x = 300
plrShip.pos.y = 300
0 голосов
/ 21 сентября 2019

Вы можете использовать метатаблицы для установки полей по умолчанию.(Я сделал некоторые предположения о том, что вы пытаетесь сделать. Если это не сработает для вас, пожалуйста, добавьте пояснения к вашему вопросу.)

local Point = {x=0, y=0}
Point.__index = Point
function Point:new(p)
  p = p or {}
  setmetatable(p, self)
  return p
end

-- create new ship class
local Ship = {}
Ship.__index = Ship
function Ship:new(pos)
  setmetatable(pos, Point)
  local p = {pos = pos, vector = Point:new()}
  setmetatable(p, self)
  return p
end

-- Create new ship...
local plrShip = Ship:new{}
plrShip.pos.x = 300
plrShip.pos.y = 300
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...