4

我最近一直在 Lua 中查找链接列表,并且有一个快速的问题,到目前为止我还没有找到答案

local head = nil

head = {next = head, value = "d"}
head = {next = head, value = "c"}
head = {next = head, value = "b"}
head = {next = head, value = "a"}

local entry = head

while entry do
  print(entry.value)

  entry = entry.next
end

这将最终打印出“a,b,c,d”。我理解为什么它会向后打印,因为第一个可用的“节点”将是最后一个创建的节点(值 = a)。我的问题是为什么在最后一个之前创建的'head'仍然存在并且没有简单地在内存中被覆盖。

4

1 回答 1

7

“在内存中覆盖”是什么意思?你所做的任何事情都不会导致这种情况发生。

让我们一步一步来看看你在做什么。

local head = nil

现在存在一个名为 的局部变量head。它具有价值nil

head = {next = head, value = "d"}

让我们将其分解为这里的操作序列。这等效于以下内容:

do
  local temp = {}
  temp.next = head  --This is still `nil`
  temp.value = "d"
  head = temp
end

您构建的每个表都是唯一的值。所以让我们称之为第一个表table-d。它被构造,存储在临时变量temp中。该表的next值为nil。它的value值为"d"。并将结果存储在局部变量head中。

所以现在head有了价值table-d。下一步:

head = {next = head, value = "c"}

一样:

do
  local temp = {}
  temp.next = head  --Not nil anymore.
  temp.value = "c"
  head = temp
end

好的,我们创建一个新表。为清楚起见,我们称此表为table-c

我们将其存储在temp. 然后我们将它的next字段设置为head. 该值为table-d。我们将value字段设置为"c"。然后table-c存入head.

table-c表如下所示:

{
  next = { value = "d" }
  value = "c"
}

也就是存储在 中的表head

就这样继续下去。那么什么地方会被“覆盖”呢?

于 2013-08-05T21:19:01.067 回答