修改对象中表格的值会将所有对象的值都改变。我该如何使它只改变特定对象的值?
2013-3-17 0:50:9
收藏:0
阅读:113
评论:2
我对 Lua 中的对象并不太了解,所以请容忍我。
示例代码:
Colors = {
primary = "BF2626",
primaryGradient = {"CC2929", "B32424"}
}
function Colors:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Colors:setPrimaryGradient()
self.primaryGradient[1] ="Changed"
end
function Colors:setPrimary()
self.primary ="00FF00"
end
a =Colors:new()
b =Colors:new()
b:setPrimaryGradient()
b:setPrimary()
print(a.primaryGradient[1])
print(b.primaryGradient[1])
print(a.primary)
print(b.primary)
输出:
Changed
Changed
BF2626
00FF00
我做错了什么?
为什么变量_primary_为每个对象保留其值,但表格却没有呢?
谢谢。
点赞
用户1847592
问题可以通过以下方式轻松解决:
颜色= {
primary = "BF2626",
primaryGradient = {"CC2929", "B32424"}
}
颜色.primaryGradient.__index = 颜色.primaryGradient
function 颜色:新建(o)
o = o or {primaryGradient = setmetatable({}, self.primaryGradient)}
setmetatable(o, self)
self.__index = self
return o
end
2013-03-17 06:40:10
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你的
new函数为空表设置了元表。这个元表有函数和内部数据。它还设置了一个__index元方法。这很重要。你的
setPrimaryGradient方法将self作为一个隐含的参数。在这种情况下,self是在new中创建的新表。你的问题在这里:self.primaryGradient[1]并不是一个单独的构造。它是 _两个单独的操作_。我们来看看 Lua 如何使用它:self["primaryGradient"][1]。看到问题了吗?首先,
self["primaryGradient"]将检查self表并获取它的primaryGradient成员。问题在于,因为self有一个__index元方法,并且self直接没有primaryGradient成员,它将直接使用__index元方法。因此,它将从元表中获取primaryGradient。这是一个_共享_的元表。然后,
[1]部分将在元表的成员上执行,并且会在primaryGradient的第一个元素中存储一个值, _从元表中_。setPrimary没有出现同样的问题的原因非常简单。self.primary是一个操作。因为它是一个表访问和一个赋值操作,Lua 不会使用__index元方法。它将使用__newindex元方法。由于你没有定义self的元表的__newindex,它将使用默认逻辑:在self中创建一个新成员并设置其值。setPrimaryGradient没有使用__newindex的原因是它确实使用了。只不过不是用于访问self。它在self["primaryGradient"]的访问中使用了__newindex;只有_最后_一个表访问才会调用__newindex。如果你想使用默认值来初始化你的类型,以便你可以修改它们,你需要_复制_这些值。你有时不能只引用全局值。好吧,你可以,但设置它们会非常麻烦。