【问题标题】:How do I access value in lua table?如何访问 lua 表中的值?
【发布时间】:2021-05-14 12:33:40
【问题描述】:

我有以下 lua 代码,可以打印出设备的 Mac 地址。

local sc = Command.Scan.create() 
local devices = sc:scan() 
local topicMac
local list = {}

for _,device in pairs(devices) do 
   print(device:getMACAddress())
   list[device] = device:getMACAddress()
end
  
topicMac = list[0]
print(topicMac)

由于有多个地址并且它们都列在一个表中,我想只将第一个地址保存到局部变量“topicMac”中。我尝试通过在数组中添加第一个索引(0 或 1)来达到第一个值。

为什么我会得到nil 作为回报?

【问题讨论】:

  • 都使用 0 或 1,在控制台上结果为“nil”
  • 如果你想在本地上下文之外访问一个变量,不要声明它local
  • 即使没有在本地声明,返回也是“nil”
  • 你还需要整个list,还是可以扔掉除了第一个项目之外的所有东西?如果您不需要整个list,@Senor 的答案是正确的。
  • 这里缺少很多信息:devices 是什么样的?什么是你的“第一个”MAC 地址,或者你只是想要列表中的 any mac 地址?如果您只想要第一个地址,为什么首先需要一个列表?

标签: lua lua-table


【解决方案1】:

next 关键字可用作变体函数以从表中检索第一个索引和值

local index, value = next(tab) -- returns the first index and value of a table

所以在你的情况下:

local _, topicMac = next(list)

【讨论】:

  • 对吗?让它返回第二个值似乎很随意。如果您打算丢弃表格的其余部分,您可以使用的一个小技巧是在第一次迭代后使用 break 终止循环。
  • @WhatIsProtocoll:Lua 表是无序的。它们并没有真正的第一或第二价值。
  • @luther 仅当键不是序数时,否则您可以使用 ipairs 以序数方式循环。我猜devices 表会有编号的键,所以如果您想获得第一个键,请尝试使用ipairs 以及我上面提到的内容。
  • 如果devices 是一个数组,他们可以只做local topicMac = devices[1]:getMACAddress()。无论哪种方式,您都不需要循环来从表中获取单个任意项。
  • 打破循环是个好主意,我选择了 luthers 声明,它在一行中就很好用。谢谢你们俩
【解决方案2】:

“第一”和“第二”取决于我们有什么作为键。要检查它,只需使用 print():

for k,d in pairs(devices) do 
  print(k,' = ',d:getMACAddress())
end

如果键是数字,您可以决定哪个是“第一”。如果键是字符串,您仍然可以制定算法来确定表中的第一项:

local the_first = "some_default_key"
for k,d in pairs(devices) do
  if k < the_first then   -- or use custom function: if isGreater(the_first,k) then
    the_first = k
  end
end
topicMac = devices[the_first]:getMACAddress()
print(topicMac)

如果键是对象或函数,则不能直接比较它们。所以你必须选择任何第一个项目:

for _,d in pairs(devices) do 
  topicMac = d:getMACAddress()
  break
end
print(topicMac)

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 2012-09-08
    • 2020-05-02
    • 1970-01-01
    • 2023-03-08
    • 2012-07-13
    • 1970-01-01
    • 2015-11-05
    • 2016-04-11
    相关资源
    最近更新 更多