2013-06-07 28 views
11

ビットはすべてこれで混乱します。ここに私がやろうとしていることがあります!予想されるように、私がアクセスし、別のファイルで関数をLuaのパラメータとして渡すには?

block_basic_DEF = 
{ 
    image = "button.png", 
    name = "basic block", 
    obj_table = this_obj_table.common_objects_table, 
    startup = function() init(), <----- This is the problem 
} 

: は、このようにDEFを持っている私は、このようなことをinit()関数のアドレスを渡したいというblock_basic_DEF

function spawn(params) 
    local obj = display.newImage(params.image) 
    -- etc. 

私の産卵でI

params.startup() --ieのようにすることができます実際に元のinit関数を呼び出す

私はこれがポインターへのポインタだったCの背景ですが、それは明らかにOOPの世界で悪い言語です! :-))

乾杯

+2

"*は、このようにDEFを持っている*" それは "DEF" ではありません。ルアには「定義」はありません。それは* table *です。これは* value *です。機能に似ています。 –

+0

'params.startup()'は実際には 'params'で参照される値をテーブルとして扱い、文字列' startup'でインデックスしてその値を得ます(ドット演算子)。次に、関数として値を呼び出します(括弧の演算子)。その関数は 'init'によって参照される値を関数として呼び出します。 –

答えて

17

Luaの関数は、単なる値であり、あなたは括弧なしで自分の名前を使用してそれらをasssignことができます。

function init() 
    print("init"); 
end 

block = { 
    startup = init 
} 

をそして、通常の関数のようにそれを呼び出す

block.startup() 

これはOOPの近くですが、実際には関数が通常の値であるという事実と同じくらい簡単です。

あなたは、ラムダにもっと似た何かを望んでいた場合は、名前を省略し、全体の機能を綴るする必要があります。

startup = function() print("init") end 
+0

ありがとうございます。問題は私のinit()関数がそれを参照した後に定義されたことでした。私は定義とデータを私のファイルの最上部で好むわけではありません。どのように参照を転送することができますか?乾杯。 –

+0

ラムダ関数が正しく使われているのは面倒ではありません。古代Cのイディオムを落として移動したときです。 –

+0

@MarkHula:前方参照の場合、ファイルの先頭に使用する変数を宣言する必要があります。ローカル変数の場合は 'local var1、var2、var3'行で宣言できます。あまりにも多くの名前を宣言するのが醜いならば、単一の "namespace"テーブル 'local M = {}'を宣言して、フィールドを変数として使うことができます: 'M.var1 = ...'。最後に、グローバル変数も、名前空間テーブルが暗黙的であることを除いて、このように動作します。 – hugomg

5

は、あなただけのendキーワードを忘れてしまいました。それは関数定義の一部であり、あなたはそれを省略することはできません。 Cの右端の}を残してはいけませんか?

block_basic_DEF = 
{ 
    image = "button.png", 
    name = "basic block", 
    obj_table = this_obj_table.common_objects_table, 
    startup = function() init() end, -- <-- This was the problem 
} 

は別に、以下の二つの構文のバリエーションが等しいこと形成:

function foo() 
end 

foo = function() 
end 
+1

しかし、ローカル関数を宣言している場合、構文は100%等しくありません。関数を再帰的に呼び出すには、代入の前に変数を宣言する必要があります。 'local foo; foo = function()end' – hugomg

+0

コードサンプルに 'local'がありません。 – dualed

関連する問題