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