0

let me start by showing my line of codes:

    local names = {}
    str = "Hello World"
    for count = 0, #str do
         names[count] = string.sub(str, count, count)
         names[count].id = count
    end

BTW, this is just a sample but my concept is there. Anyway, it keeps returning an error saying attempt to index field '?' (a nil value). What does this error mean? i tried using something like this in my other project it worked just fine. Except, it was an image, still why does it not apply to this instance? where does indexing apply to?

4

2 回答 2

3

这里的问题是你对如何使用默认的 lua 值类型感到困惑。表和用户数据是您将设置/获取属性的仅有的两种数据类型。我会分解你的代码,所以也许它会帮助你理解如何使用表格来做你想做的事......

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

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

上面的代码在逻辑上等价于 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
于 2012-04-24T16:11:59.667 回答
3

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

  1. 您从 0 开始索引。Lua 从 1 开始索引。for 循环应该从 1 开始。
  2. 您正在将字符串分配到表中,然后尝试分配给字符串的 id 字段。除了字符串没有字段。这就是实际引发错误的原因。
于 2012-04-24T08:09:26.077 回答