Lua索引仅适用于哪些?

时间:2012-04-24 08:05:29

标签: indexing lua

首先让我展示我的代码行:

    local names = {}
    str = "Hello World"
    for count = 0, #str do
         names[count] = string.sub(str, count, count)
         names[count].id = count
    end
顺便说一下,这只是一个样本,但我的概念就在那里。无论如何,它一直返回一个错误,说试图索引字段'?' (零值)。这个错误是什么意思?我尝试在我的其他项目中使用这样的东西它工作得很好。除了它是一个图像,为什么它不适用于这个实例?索引在哪里适用?

2 个答案:

答案 0 :(得分:3)

我发现您的代码有两个问题:

  1. 你的索引从0开始。 Lua从1开始索引.for循环应该从1开始。
  2. 您正在为表中指定一个字符串,然后尝试分配给该字符串的id字段。字符串除外没有字段。这实际上是在抛出错误。

答案 1 :(得分:3)

这里的问题是你对如何使用默认的lua值类型感到困惑。 tables和userdata是您将设置/获取属性的唯一两种数据类型。我会分解你的代码,所以它可能会帮助你理解如何使用表来做你想要的......

你开始创建一个名为names的空表。该表中没有可以引用的值或属性。

local names = {}
在你的for循环中,你从字符串'str'一次拉出一个字符,并将它分配给count指向的索引处的名称(应该从1开始,顺便说一下..因为字符串和表索引在lua是1基于,而不是基于零。所以在第二个循环中,你基本上是这样做的:

names[1] = 'H'

(首先循环计数器为0,所以string.sub(str,0,0)返回一个空字符串)

直接在那之后,你马上做了几个步骤,这就是你感到困惑的地方。打破它应该为你清理它。

local a_char = names[count] -- get the string value in index 'count'
a_char.id = count           -- try to set property id on that string value
names[count] = a_char       -- assign this value to index 'count' in table names

上面的代码在逻辑上等同于名称[count] .id = count。您正在尝试在字符串值上创建/设置名为“id”的属性。字符串没有该属性,你不能创建它,这就是解释器咆哮你的原因。

如果要将逻辑信息一起存储在lua表中,则规范是使用嵌套表。听起来你想基本上将每个字符存储在字符串'str'中,以及它在表'names'中的位置。这就是你如何做到的:

local names = {}
str = "Hello World"
for count = 1, #str do
    local cha, idx = string.sub(str, count, count), count
    -- below creates an anonymous table with two properties (character, and id) and
    -- adds it to the end of table 'names'.
    table.insert(names, {character = cha, id = idx})
    -- or 
    -- names[count] = {character = cha, id = idx}
end

按照您希望的方式对信息进行逻辑分组,数据在表格中大致如下所示:

{ {character = 'H', id = 1}, {character = 'e', id = 2} ... }

如果您想要表格中第一项的ID,您可以像上面所做的那样引用它:

local first_id = names[1].id -- access property id from table in first index in table names