lua - lua中表格的奇怪错误
问题描述
我正在向 lua 中的表添加一个字符串。当我在函数中使用表时,原始表正在改变。我只是一个初学者,但我认为该功能无法做到这一点,因为它超出了它的范围。我有什么明显的遗漏吗?
local testTable= {}
testTable.name = {}
testTable.name[1] = "Jon"
print(testTable.name[1])
local function testFunc(a)
a.name[1] = "Bob"
end
local newTable = testTable
testFunc(newTable)
print(testTable.name[1])
我预计输出是:
Jon
Jon
实际输出为:
Jon
Bob
testFunc 如何改变 testTable?
解决方案
当我在函数中使用表时,原始表正在改变。...我认为该功能无法做到这一点,因为它超出了它的范围。
局部变量有自己的范围,但表没有。要记住两件事:
- 变量存储引用,而不是值。(这只会对可变值产生影响。)
- 表是可变的,即它们可以在内部更改。
分解它:
local newTable = testTable
在这一行中,您将一个变量分配给另一个变量,因此两个变量都引用同一个表。
我们通过分配给该表中的索引来改变表,因此testFunc
更改a
(实际上a.name
)引用的任何内容。这很方便,因为它允许我们编写函数来改变我们作为参数传递的表。
正如您所期望的那样,以下函数什么也不做,因为它将一个新表分配给裸名a
(它恰好是一个局部变量):
local function doNothing(a)
a = {name = {'Bob'}}
end
推荐阅读
- css - Vue中的过渡元素
- javascript - 不能用作 JSX 组件。它的返回类型“void”不是有效的 JSX element.ts(2786)
- java - 如何从同一生产者向不同的 Kafka 主题和模式注册表生成消息
- docker - Docker 只识别相对目录,不识别绝对目录
- vb.net - 覆盖参数 [ 和 ] 之间的文本文件
- tailwind-css - 从设计系统导出的 tailwind.dist.css 导致主项目中的 css 重复
- node.js - 如何使用 Joi 验证十进制数字的精度
- fetch - 通过 Office Scripts Fetch 调用 API 时出现 CORS 问题
- file - 如何从文件中删除短行文本
- sql - SQL 基于一列去重