为什么Lua中需要元表? 我是一个C++程序员,学习Lua,试图理解为什么需要GETMeta()和StEntAtabable()。p> 根据所有的教程,如果我想从我的子类定义中的某个“基本类”(使用C++概念)中生成一个子类,我会有这样的事情: 1) setmetatable(subclass, getmetatable(baseclass))

为什么Lua中需要元表? 我是一个C++程序员,学习Lua,试图理解为什么需要GETMeta()和StEntAtabable()。p> 根据所有的教程,如果我想从我的子类定义中的某个“基本类”(使用C++概念)中生成一个子类,我会有这样的事情: 1) setmetatable(subclass, getmetatable(baseclass)),c++,oop,lua,C++,Oop,Lua,但是为什么呢?为什么不干脆做: 2) setmetatable(subclass, baseclass) 或者,为什么不将所有基类成员复制到子类中并检查元表呢 3) for k,v in pairs(baseclass) do subclass[k] = v end 毕竟,从概念上讲,我所要做的就是使我的子类成为基类的一种类型,然后添加一些差异。因此,我首先是基类的副本,然后进行修改,使我的子类与众不同 然后我突然意识到,元表可能是共享的实例。也就是说,具有相同元表的类在内存中共享

但是为什么呢?为什么不干脆做:

2) setmetatable(subclass, baseclass)
或者,为什么不将所有基类成员复制到子类中并检查元表呢

3) for k,v in pairs(baseclass) do
    subclass[k] = v 
end
毕竟,从概念上讲,我所要做的就是使我的子类成为基类的一种类型,然后添加一些差异。因此,我首先是基类的副本,然后进行修改,使我的子类与众不同

然后我突然意识到,元表可能是共享的实例。也就是说,具有相同元表的类在内存中共享完全相同的元表。是这样吗?如果我更改单个元表中的一个数据元素,那么所有具有该元表的表都将经历相同的数据更改?如果我在一个元表中有一个“counter”变量并递增它,那么所有使用该元表的类都将递增该成员变量

这就是所有教程中都没有明确说明的区别,是什么让元表如此混乱。因此,在C++术语中,元语言是<强>静态共享它们的类的成员。

但是上面的方法3仍然可以实现这个目标,但这是浪费,因为它创建了基类成员的副本,而不是共享它们

那么,这是创建子类的有效函数吗?(复制基类,然后添加新成员,使其与该基类不同)

localdeveloper=子类(Person,{skillz={“c++”,“lua”,“python”})
函数子类(基本、新成员)
局部自={}
setmetatable(self,getmetatable(base))
本地mt=getmetatable(自)
对于k,v成对(base)do——将不在其元表中的base成员复制到我们的元表中
mt[k]=v
结束
对于k,v成对(新的_成员)do--添加新成员或覆盖,使我们不同于base!
mt[k]=v
结束
回归自我
结束

Lua没有继承;它有一些机制,您可以在此基础上构建继承。因此,在Lua中有几种生成“派生类”的方法。你说的是单一方法的一部分。它是否有意义完全取决于实现继承的其他方法是什么。什么是
基类
,它的元表是什么?如果没有这些,我们就无法真正知道。我认为这一点的本质,我的问题是,真的,“元表是否在使用它们的表之间共享,我的意思是完全像在相同的实例中一样共享?”为此,我可以写一个快速的代码片段来找出答案,但我也在寻找一些注意事项和缺陷。如果将同一个元表设置为多个TAE,它们将引用同一个元表,是的。元表有用的原因还有很多,但对于一个如此广泛的问题来说,这是非常广泛的。请列举原因。这一点尤其重要,因为我正在学习,所以我从第一天开始就采取正确的方法。下次你想回复某人,所以你应该“他们”,比如说@warspyking。你很幸运,我回到这个问题,看到你的replyLua没有继承权;它有一些机制,您可以在此基础上构建继承。因此,在Lua中有几种生成“派生类”的方法。你说的是单一方法的一部分。它是否有意义完全取决于实现继承的其他方法是什么。什么是
基类
,它的元表是什么?如果没有这些,我们就无法真正知道。我认为这一点的本质,我的问题是,真的,“元表是否在使用它们的表之间共享,我的意思是完全像在相同的实例中一样共享?”为此,我可以写一个快速的代码片段来找出答案,但我也在寻找一些注意事项和缺陷。如果将同一个元表设置为多个TAE,它们将引用同一个元表,是的。元表有用的原因还有很多,但对于一个如此广泛的问题来说,这是非常广泛的。请列举原因。这一点尤其重要,因为我正在学习,所以我从第一天开始就采取正确的方法。下次你想回复某人,所以你应该“他们”,比如说@warspyking。你很幸运,我回到这个问题上看到了你的回答