Lua - 尝试创建一个好的 Vec2 class
Lua - trying to create a good Vec2 class
我正在学习如何使用 Lua 和 Love2d,我想使用元方法和元表创建一个 Vec2 class。这是我目前所拥有的:
class.lua:(基础 class 文件)
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)
我得到这个错误:
Error: main.lua:12: attempt to perform arithmetic on local 'v1' (a nil
value)
Vec2.new
不是 return 值。因此赋值 local v1 = Vec2:new(10,10)
导致 v1
为 nil
试试 local v1 = Vec2(10,10)
。 Vec2.add
中同样的错误
实例是在 __call
元方法中创建的,它使用您的参数调用 new。你不应该直接调用 new
除非你想重新初始化一个现有的实例。
function Class:__call(...)
local inst = setmetatable({}, self)
inst:new(...)
return inst
end
我正在学习如何使用 Lua 和 Love2d,我想使用元方法和元表创建一个 Vec2 class。这是我目前所拥有的:
class.lua:(基础 class 文件)
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)
我得到这个错误:
Error: main.lua:12: attempt to perform arithmetic on local 'v1' (a nil value)
Vec2.new
不是 return 值。因此赋值 local v1 = Vec2:new(10,10)
导致 v1
为 nil
试试 local v1 = Vec2(10,10)
。 Vec2.add
实例是在 __call
元方法中创建的,它使用您的参数调用 new。你不应该直接调用 new
除非你想重新初始化一个现有的实例。
function Class:__call(...)
local inst = setmetatable({}, self)
inst:new(...)
return inst
end