ここでの問題は、デフォルトのlua値タイプの使用方法について混乱していることです。テーブルとuserdataは、プロパティを設定/取得する2つのデータ型のみです。私はあなたのコードを分解するので、多分それはあなたがあなたが望むことをするためにテーブルを使う方法を理解するのを助けるでしょう...
名前と呼ばれる空のテーブルを作成することから始めます。そのテーブル内には、参照できる値や属性はまったくありません。
local names = {}
forループでは、文字列'str'から一度に1文字ずつ引き出し、countが指すインデックスの名前に割り当てます(luaの文字列とテーブルのインデックスは1であるため、1から開始する必要があります。ベース、ゼロベースではありません)。したがって、2番目のループでは、基本的にこれを実行しています。
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テーブルにまとめて格納する場合は、ネストされたテーブルを使用するのが一般的です。基本的に、各文字をテーブル「names」内の位置とともに文字列「str」に格納したいようです。これはあなたがそれをする方法です:
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