我一直在从 http://www.lua.org/pil/3.6.html 学习Lua中的表构造函数,但我无法理解这两段代码之间的区别。
--between code I've written--
list = nil
for line in io.lines() do
list = {value=line}
end
l = list
while l do
print(l.value)
end
--and between code they have written--
list = nil
for line in io.lines() do
list = {next=list, value=line}
end
l = list
while l do
print(l.value)
l = l.next
end
链表需要有办法到达链中的下一个值。
如果不在表中定义next
则没有下一个值,索引value
不会自动l
移动到列表中的下一个值。如果不定义next = list
list
的最后一个值将丢失,最终结果将只是一个值,即数据源中的最后一个值。
我更改了此示例,因此不需要使用文件:
在这里,您的代码每次都会无限期地循环打印 f。
list = nil
for _,letter in ipairs({'a','b','c','d','e','f'}) do
list = {value=letter} -- we reassign list with new data without preserving the
-- previous data
end
l = list
while l do
print(l.value) -- the last value of list was {value = 'f'} and it will not
-- change in this loop
end
其中,作为示例中的代码将遍历给定的每个值并完成。
list = nil -- this marks the end of the list and creates our name
-- we will use to store the list.
for _,letter in ipairs({'a','b','c','d','e','f'}) do
list = {next=list, value=letter} -- the first loop we will create a table where `next` is
-- nil.
-- on the second loop we create a table where `next` is
-- referencing the table from loop 1 that is stored in list.
-- this will repeat until we have gone through all the
-- letter from our source.
end
l = list
while l do
print(l.value) -- print our letter.
l = l.next -- move on to the table we stored in `next`.
-- this loop ends when we get to the value where
-- `next` was nil.
-- the table from the first loop of our for loop.
end
代码的 for 循环不保留以前的值list
。list
最终将包含输入的最后一行。您的 while 循环将是无限的。
其代码的 for 循环将以前的list
值保存在新的list
值中。它们的 while 循环在每次迭代时都会l
变化。因此,它每次打印不同的值,并在nil
l
时停止。