LUA队列实现
LUA queue implementation
我正在尝试在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 概念,但我无法弄清楚它是什么。
这是我在 ideone 上看到的输出。 http://ideone.com/72yQPs
1 b
2 c
0 a
remove: q.data[q.first]= a q.first= 0
remove: rval= a
remove: q.first= 1
list item= nil
remove: q.data[q.first]= b q.first= 1
remove: rval= b
remove: q.first= 2
list item= nil
remove: q.data[q.first]= c q.first= 2
remove: rval= c
remove: q.first= 3
list item= nil
对 rval
的赋值 有效,但是 remove
的 return 不是因为范围错误,由你对 local
.
的使用
else
print("remove: q.data[q.first]= ", q.data[q.first], " q.first= ", q.first)
local rval = q.data[q.first] <<< THIS rval ...
print("remove: rval= ", rval)
....
end
return rval **<<< ...is not the same variable as THIS rval.**
删除 'local' 关键字,您会得到这个,这可能是您所期望的。
1 b
2 c
0 a
remove: q.data[q.first]= a q.first= 0
remove: rval= a
remove: q.first= 1
list item= a
remove: q.data[q.first]= b q.first= 1
remove: rval= b
remove: q.first= 2
list item= b
remove: q.data[q.first]= c q.first= 2
remove: rval= c
remove: q.first= 3
list item= c
问题出在我用来将代码上传到 ESP8266 的 ESPlorer。显然你不能在使用 esplorer 时以 ']' 字符结束一行(thx to pjsg on github)。解决办法是切换到 "turbo" 模式(esplorer - 设置)。这消除了 Lua 错误并且代码按预期运行。
local queue = {}
table.insert(queue,'a')
table.insert(queue,'b')
table.insert(queue,'c')
print(table.remove(queue,1)) -- a
print(table.remove(queue,1)) -- b
print(table.remove(queue,1)) -- c
print(table.remove(queue,1)==nil) -- true
我正在尝试在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 概念,但我无法弄清楚它是什么。
这是我在 ideone 上看到的输出。 http://ideone.com/72yQPs
1 b
2 c
0 a
remove: q.data[q.first]= a q.first= 0
remove: rval= a
remove: q.first= 1
list item= nil
remove: q.data[q.first]= b q.first= 1
remove: rval= b
remove: q.first= 2
list item= nil
remove: q.data[q.first]= c q.first= 2
remove: rval= c
remove: q.first= 3
list item= nil
对 rval
的赋值 有效,但是 remove
的 return 不是因为范围错误,由你对 local
.
else
print("remove: q.data[q.first]= ", q.data[q.first], " q.first= ", q.first)
local rval = q.data[q.first] <<< THIS rval ...
print("remove: rval= ", rval)
....
end
return rval **<<< ...is not the same variable as THIS rval.**
删除 'local' 关键字,您会得到这个,这可能是您所期望的。
1 b
2 c
0 a
remove: q.data[q.first]= a q.first= 0
remove: rval= a
remove: q.first= 1
list item= a
remove: q.data[q.first]= b q.first= 1
remove: rval= b
remove: q.first= 2
list item= b
remove: q.data[q.first]= c q.first= 2
remove: rval= c
remove: q.first= 3
list item= c
问题出在我用来将代码上传到 ESP8266 的 ESPlorer。显然你不能在使用 esplorer 时以 ']' 字符结束一行(thx to pjsg on github)。解决办法是切换到 "turbo" 模式(esplorer - 设置)。这消除了 Lua 错误并且代码按预期运行。
local queue = {}
table.insert(queue,'a')
table.insert(queue,'b')
table.insert(queue,'c')
print(table.remove(queue,1)) -- a
print(table.remove(queue,1)) -- b
print(table.remove(queue,1)) -- c
print(table.remove(queue,1)==nil) -- true