2013-06-17 26 views
6

テーブルに関数を格納することができました。しかし、今私はどのようにそれらを呼び出すのか分からない。最終的なテーブルには約100回の呼び出しがありますので、可能であればforeachループのように呼び出していきたいと思います。ありがとう!関数定義AAANDLua - テーブルに格納された関数を実行する

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 

:ここ

は、表が定義されていた方法です

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

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

EDIT:彼らは少しを持っていますので、私は機能を変更

より多くの文脈。基本的には、文字列を返します。 私は、関数を呼び出す最後に、これらの文字列をすべて含むテーブル(理想的にはレベルテーブル)を用意しています。

+1

ループでどのように呼び出すべきか、どのようにしたいかははっきりしません。おそらくあなたは擬似コードを説明して与えることができます。 BTW-Luaにはポインタがありません。関数は 'function'型の値であり、式のどこでも使用できます。 –

+0

@TomBlodget、それを指摘してくれてありがとう。私はそれを訂正した。 – brain56

答えて

4

の操作を行います。

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

今、asdには必要な領域文字列が含まれています。データが十分であろうエリアを取得するために

asd["scene0"][1] 

:同じようにアクセス

asd[1][1] 

:理想的なものの、私のようなデータにアクセスできるようにするためのもの。私はちょうどキーを回避する必要があります。

ありがとうございます。

+0

おそらくメタテーブルでそれを行うことができますが、それはおそらく努力に値するものではありません;) – dualed

1

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

game_level_hintsテーブルの各レベルを呼び出すときに、on_scenetalkが呼び出されたとします。

もしそうなら、これはあなたがそれを行うことができる方法である。

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 
6

短い答え:あなたが通常行うだろうとあなただけの、(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」というエラーが表示されます(これらは両方とも戻り値nilを返します)と呼びます。

あなたがgame_level_hints.levels["level0"]に保存されている機能を呼び出したい場合は、あなただけのあなたたちは答えてコメントし、私は解決策として、次のコードを思い付くことができたものを使用してgame_level_hints.levels["level0"]()

関連する問題