【问题标题】:lua Hashtables, table index is nil?lua Hashtables,表索引为零?
【发布时间】:2012-04-15 16:51:30
【问题描述】:

我目前正在尝试做的是制作一个包含 person_records(作为值)的电子邮件地址表(作为键)。 person_record 在其中包含 6 个左右的东西。我遇到的问题是,当我尝试将电子邮件地址分配为表的键时,它会抱怨并说表索引为零......这是我到目前为止所拥有的:

random_record = split(line, ",")
person_record = {first_name = random_record[1], last_name = random_record[2], email_address = random_record[3], street_address = random_record[4], city = random_record[5], state = random_record[6]}
email_table[person_record.email_address] = person_record

我编写了自己的拆分函数,它基本上接受一行输入并提取 6 个逗号分隔值并将它们存储在一个表中(random_record)

当我尝试说 email_table[person_record.email_address] = person_record 时出现错误。 但是当我打印出 person_record.email_address 它不是 nil 时,它会打印出我存储在其中的字符串。我很困惑。

function split(str, pat)
   local t = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pat
   local last_end = 1
   local s, e, cap = str:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
     table.insert(t,cap)
      end
      last_end = e+1
      s, e, cap = str:find(fpat, last_end)
   end
   if last_end <= #str then
      cap = str:sub(last_end)
      table.insert(t, cap)
   end
   return t
end

【问题讨论】:

  • 您能发布您收到的确切错误消息吗?
  • 不幸的是,这是确切的错误消息:(“表索引为零”

标签: lua hashtable null lua-table


【解决方案1】:

以下代码是从您的示例中复制和粘贴的,运行良好:

email_table = {}
random_record = {"first", "second", "third"}
person_record = {first_name = random_record[1], last_name = random_record[1], email_address = random_record[1]}
email_table[person_record.email_address] = person_record

所以你的问题在于你的split 函数。

顺便说一句,Lua 没有“哈希表”。它只是具有存储键/值对的“表”。这些是否碰巧使用哈希是一个实现细节。

【讨论】:

  • 啊。好的..我的教授说lua只有哈希表,但我不同意:p。好吧,我对 email_table 所做的就是通过 email_table = {} 对其进行初始化,然后我将其分配给上面的代码。我知道它不是零,因为我可以说 email_table["HAHA"] = person_record 之类的东西,并且它可以工作。我只是不明白为什么它不允许 person_record.email_address...
  • 那太奇怪了……谢谢! :) 因为我刚刚开始,所以我有很多关于 lua 的问题。我可能会回来:D
  • 出于好奇,nicol,你能告诉我为什么我的拆分不起作用吗?它基本上是根据分隔符拆分一条线,然后将值存储到一个表中。我已经为我的拆分功能添加了代码
  • @cj1098:这是一个不同的问题,你应该用“”按钮问。
【解决方案2】:

您似乎遍历了一些包含逗号分隔数据的行。 查看您的 split 函数,只要在特定行中没有分隔符 (,) 符号,它就会停止。因此,用少于 3 个 , 分隔的字段(对于 非常常见的示例:文件末尾的空行)提供任何内容将生成一个不会上升到 [3] 的表格。处理任何空表值将返回 nil,因此 person_record.email_address 也将在代码的第 2 行设置为 nil。然后,当您尝试使用存储在 person_record.email_address 中的此 nil 作为第 3 行中 email_table 的索引时,您将得到您提到的确切错误。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2014-05-06
    • 1970-01-01
    • 2017-01-20
    • 2015-10-25
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多