7

私は本から Lua を学んでおり、プログラマーではありません。次の関数 (本から直接コピーしたもの) を使用してデータのテーブルをファイルに保存しようとしていますが、_G[resTable] から文字列を取得しようとすると、関数でエラーが発生します。なんで?

function readFromFile(filename,resTable)
    local hfile = io.open(filename)
    if hfile == nil then return end
    local results = {} -why is this table here?
    local a = 1
    for line in hfile:lines() do-- debug shows this loop doesn't run (no lines in hfile?)
        _G[resTable[a]] = line
        a = a + 1
    end
end

function writeToFile(filename, resTable)
    local hfile = io.open(filename, "w")
    if hfile == nil then return end
    local i
    for i=1, #resTable do
        hfile:write(_G[resTable[i]])--bad argument #1 to 'write' (string expected, got nil)
    end
end

'writeToFile" は、_G[resTable[i]] に :write しようとするとエラーになります。ここにリストされている前の 2 つの関数では、なぜそれらが _G[resTable[i]] を参照しているのかわかりません。 _G に書き込むコード。

したがって、実行順序は次のとおりです。

local aryTable = {
"Score",
"Lives",
"Health",
}

readFromFile("datafile", aryTable)

writeToFile("datafile", aryTable)

エラーが発生します:

bad argument #1 to 'write' (string expected, got nil)
stack traceback:
[C]: in function 'write'
test.lua:45: in function 'writeToFile'
test.lua:82: in main chunk
4

3 に答える 3

0

このコードは、ファイルからデータを読み取り、名前が で指定されているグローバル変数に書き込みますaryTable。ファイルが空であるため、readFromFile実際には変数値を設定しません。変数値が設定されていないため、変数値を取得しようとするとwriteToFile失敗します。

変数が設定されるようにファイルにデータを入れてみるか、ファイルに書き込む前に自分で変数値を設定してみてください (例:Score = 10など)。

于 2013-10-10T20:37:23.123 に答える
0

これらは一般化された「任意のファイルから/への任意のテーブルの読み取り/書き込み」機能ではありません。[ローカルへの参照] テーブル自体ではなく、グローバル テーブルの名前を引数として期待しているようです。それらは、本に出てくる傾向がある非常に具体的な問題に対する一種の 1 回限りの解決策のように見えます。:-)

あなたの関数は _G で何もするべきではありません。手元に API リファレンスはありませんが、読み取りループは次のようになっているはずです。

resTable[a] = line

書き込みループが実行されます

hfile:write(resTable[i])

そのローカルの「結果」テーブルも捨ててください。:-)

于 2013-10-10T20:04:10.567 に答える