Reading http://lua-users.org/wiki/LuaClassesWithMetatable the Vector示例对元表使用以下技术:
Vector={}
Vector_mt={__index=Vector}
function Vector:new(x,y)
return setmetatable({x=x,y=y},Vector_mt)
end
function Vector:add(v)
return Vector:new(self.x+v.x,self.y+v.y)
end假设我们想要使用__add来支持+运算符,我们需要在元表中显式地提到它,并且我们还需要重新排序,以便在Vector:add之后提到元表和构造函数
Vector={}
function Vector:add(v)
return Vector:new(self.x+v.x,self.y+v.y)
end
Vector_mt={__index=Vector,__add=Vector.add}
function Vector:new(x,y)
return setmetatable({x=x,y=y},Vector_mt)
end为了避免在元表中提到每个元方法,我可以将Vector本身设置为元表,然后我可以添加__add (显然,还有__index)作为Vector的方法
Vector={}
function Vector:new(x,y)
return setmetatable({x=x,y=y},Vector)
end
function Vector:add(v)
return Vector:new(self.x+v.x,self.y+v.y)
end
function Vector:__index(k)
return Vector[k]
end
function Vector:__add(b)
return self:add(b)
end不推荐使用后者吗?为什么?
发布于 2020-12-11 11:35:10
添加,而且我们还需要重新排序,这样元表和构造函数就会在
:add之后提到
不是的。表是一个引用。在添加metatable时,它不会被深度复制。您可以稍后向其添加字段,这将影响元表。
这太复杂了:
function Vector:__index(k)
return Vector[k]
end只需执行以下操作:
Vector.__index = Vector有关Lua“类”的示例,请参阅https://codereview.stackexchange.com/a/253022/230923。
https://stackoverflow.com/questions/65243035
复制相似问题