【发布时间】:2016-09-11 18:27:22
【问题描述】:
我正在尝试在Lua中实现一个简单的FIFO队列,代码如下:
dataQ = {}
dataQ.first = 0
dataQ.last = -1
dataQ.data = {}
function insert(q, val)
q.last = q.last + 1
q.data[q.last] = val
end
function remove(q)
if (q.first > q.last) then
rval = -1
else
print("remove: q.data[q.first]= ", q.data[q.first], " q.first= ", q.first)
local rval = q.data[q.first]
print("remove: rval= ", rval)
q.data[q.first] = nil -- to allow garbage collection
q.first = q.first + 1
print("remove: q.first= ", q.first)
end
return rval
end
insert(dataQ,"a")
insert(dataQ,"b")
insert(dataQ,"c")
for i,v in pairs(dataQ.data) do
print(i, v)
end
repeat
local x = remove(dataQ)
print("list item= ", x)
until (dataQ.first > dataQ.last)
当我将脚本加载到 ESP8266(通过 ESPlorer)时,我收到以下 lua 解释器错误:
LUA interpreter error detected!
stdin: 1: ')' expected near ']w([[ print("remove: rval= ", rval)]]);
然而脚本运行,我得到以下输出:
1 b
2 c
0 a
remove: q.data[q.first]= a q.first= 0
remove: rval= nil
remove: q.first= 1
list item= nil
队列插入功能似乎按预期工作,但队列删除功能却没有。 remove 函数中的第一个 lua print 语句显示了 q.data[q.first] 的正确预期值,但在分配 rval 之后,该值是“nil”而不是预期的“a”
我想我在这里误解了一个基本的 lua 概念,但我无法弄清楚它是什么。
【问题讨论】:
-
@Amadan it is 在源中,
remove函数的中间:print("remove: rval= ", rval)。 -
使用 ESPlorer 0.2.0-rc3 和来自
dev分支的最新 NodeMCU 为我工作。我的意思是我没有收到“LUA 解释器错误”。