Lua中的链表

我最近在研究 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"。我理解为什么会倒序打印,因为第一个可用的 'node' 是最后创建的一个(value = a)。我的问题是为什么在最终的头部之前创建的 'head' 仍然存在并且没有在内存中被简单地覆盖。

点赞
用户734069
用户734069

你所谓的“在内存中被覆盖”是什么意思?没有你所做的任何操作会引起这种情况。

让我们逐步看一下你所做的操作。

local head = nil

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

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

让我们将其分解为以下序列操作:

do
  local temp = {}
  temp.next = head  -- 这里还是 `nil`
  temp.value = "d"
  head = temp
end

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

因此,现在 head 的值为 table-d。下一步:

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

同样的操作:

do
  local temp = {}
  temp.next = head -- 不再是 `nil`
  temp.value = "c"
  head = temp
end

我们创建了一个新的 table。为了清晰起见,我们称此 table 为 table-c

我们将其存储在 temp 中。然后我们将 next 字段设置为 head 中的值。那个值是 table-d。我们将 value 字段设置为 "c"。然后将 table-c 存储在 head 中。

table-c table 看起来是这样的:

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

这就是存储在 head 中的 table。

这样继续下去。那么“被覆盖”的东西应该在哪里?

2013-08-05 21:19:01