8

関数をテーブルに格納できました。しかし、今ではそれらを呼び出す方法がわかりません。最終テーブルは100回くらいの呼び出しになるので、できればforeachループのように呼び出したいです。ありがとう!

テーブルの定義方法は次のとおりです。

game_level_hints = game_level_hints or {}
game_level_hints.levels = {}
game_level_hints.levels["level0"] = function()
    return
    {
        [on_scene("scene0")] =
        {
            talk("hint0"),
            talk("hint1"),
            talk("hint2")
        },
        [on_scene("scene1")] =
        {
            talk("hint0"),
            talk("hint1"),
            talk("hint2")
        }
    }
end

Aaand 関数定義:

function on_scene(sceneId)
    -- some code
    return sceneId
end

function talk(areaId)
    -- some code
    return areaId
end

編集:

関数を変更して、もう少しコンテキストを持たせるようにしました。基本的に、文字列を返すようになりました。そして、私が期待していたのは、関数の呼び出しの最後に、これらすべての文字列を含むテーブル (理想的にはレベル テーブル) を作成することです。

4

3 に答える 3

8

簡単な答え: 配列に格納された関数 (参照) を呼び出すには、(parameters)通常どおりに を追加するだけです。

local function func(a,b,c) return a,b,c end
local a = {myfunc = func}
print(a.myfunc(3,4,5)) -- prints 3,4,5

実際、これを次のように単純化できます。

local a = {myfunc = function(a,b,c) return a,b,c end}
print(a.myfunc(3,4,5)) -- prints 3,4,5

長い答え: 期待される結果が何であるかを説明していませんが、あなたが書いたものは、期待どおりに機能しない可能性があります。このフラグメントを取ります:

game_level_hints.levels["level0"] = function()
    return
    {
        [on_scene("scene0")] =
        {
            talk("hint0"),
        }
    }
end

[この段落は、質問が更新された後は適用されなくなりました]関数を参照on_scenetalkますが、それらの関数をテーブルに「保存」しません(質問で明示的に参照したため、質問はこれらの関数に関するものだと思います) . 実際にこれらの関数を呼び出して、それらが返す値を格納します (両方とも を返します)。したがって、このフラグメントが実行されると、インデックスとして使用しnilて格納しようとすると、「テーブル インデックスが nil です」というエラーが発生します。nilnil

に保存した関数を呼び出したい場合はgame_level_hints.levels["level0"]、次のようにします。game_level_hints.levels["level0"]()

于 2013-06-17T02:14:59.523 に答える
5

皆さんの回答とコメントを使用して、解決策として次のコードを思いつくことができました。

asd = game_level_hints.levels["level0"]()

今、asd必要なエリア文字列が含まれています。理想的には、次のようなデータにアクセスできるようにするつもりでした。

asd[1][1]

次のようにアクセスします。

asd["scene0"][1]

領域データを取得するだけで十分です。キーを回避する必要があります。

みんなありがとう。

于 2013-06-17T03:09:39.750 に答える
1

あなたがやろうとしていることは本当に明確ではありません。無名関数内で、on_sceneの戻り値をキーとして使用するテーブルを返しています。しかし、あなたon_sceneは何も返しません。についても同じですtalk

テーブルの各レベルを呼び出すときに、あなたが望んon_sceneでいて、呼び出されると仮定します。talkgame_level_hints

もしそうなら、これはあなたがそれを行う方法です:

local maxlevel = 99
for i = 0, maxlevel do
  game_level_hints.levels["level" .. i] = function()
    on_scene("scene" .. i)
    talk("hint" .. i)
  end
end
-- ...
for levelname, levelfunc in pairs(game_level_hints.levels) do
  levelfunc()
end
于 2013-06-17T02:12:14.787 に答える