Lua - пытаюсь создать хороший класс Vec2 - PullRequest
1 голос
/ 16 апреля 2020

Я учусь использовать Lua и Love2d, и я хочу создать класс Vec2, используя метаметоды и метатаблицы. Вот что у меня есть:

класс. lua: (файлы базового класса)

local Class = {}
Class.__index = Class

-- Constructor
function Class:new() end

-- Inherite from Class
-- type = The name of the new class
function Class:derive(type)
  print("Class:", self)
  local cls = {}
  cls["__call"] = Class.__call
  cls.type = type
  cls.__index = cls
  cls.super = self
  setmetatable(cls, self)
  return cls
end

function Class:__call(...)
  local inst = setmetatable({}, self)
  inst:new(...)
  return inst
end

function Class:getType()
  return self.type
end

return Class

vec2. lua

local class = require "class"
local Vec2 = class:derive("Vec2")

function Vec2:new(x, y)
  self.x = x or 0
  self.y = y or 0
  getmetatable(self).__add = Vec2.add
end

function Vec2.add(a, b)
  local nx, ny
  nx = a.x + b.x
  ny = a.y + b.y
  return Vec2:new(nx, ny)
end

return Vec2

и в моем main. lua У меня есть:

local v1 = Vec2:new(10, 10)
local v2 = Vec2:new(5, 3)
local v3 = v1 + v2
print("v3:", v3.x, v3.y)

, и я получаю эту ошибку:

Ошибка: main. lua: 12: попытка выполнить арифметику c на локальном 'v1' (нулевое значение)

1 Ответ

2 голосов
/ 16 апреля 2020

Vec2.new не возвращает значение. Следовательно, присваивание local v1 = Vec2:new(10,10) приводит к v1, являющемуся nil

Вместо local v1 = Vec2(10,10). Та же ошибка в Vec2.add

Isntance создается в метаметоде __call, который вызывает new с вашими параметрами. Вы не должны вызывать new напрямую, если не хотите повторно инициализировать существующий экземпляр.

function Class:__call(...)
  local inst = setmetatable({}, self)
  inst:new(...)
  return inst
end
...