首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用什么作为metatable?

使用什么作为metatable?
EN

Stack Overflow用户
提问于 2020-12-11 06:10:30
回答 1查看 52关注 0票数 3

Reading http://lua-users.org/wiki/LuaClassesWithMetatable the Vector示例对元表使用以下技术:

代码语言:javascript
复制
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之后提到元表和构造函数

代码语言:javascript
复制
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的方法

代码语言:javascript
复制
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

不推荐使用后者吗?为什么?

EN

回答 1

Stack Overflow用户

发布于 2020-12-11 11:35:10

添加,而且我们还需要重新排序,这样元表和构造函数就会在

:add之后提到

不是的。表是一个引用。在添加metatable时,它不会被深度复制。您可以稍后向其添加字段,这将影响元表。

这太复杂了:

代码语言:javascript
复制
function Vector:__index(k)
    return Vector[k]
end

只需执行以下操作:

代码语言:javascript
复制
Vector.__index = Vector

有关Lua“类”的示例,请参阅https://codereview.stackexchange.com/a/253022/230923

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65243035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档