2017-04-27 2 views
1

私はluaの関数構文の砂糖を呼び出す方法についていくつか知っていました。なぜluaの構文の砂糖はここでは機能しません(コロンで関数を呼び出す)?

A = {} 
function A.func(a) print(tostring(a))end 

私は上記の表Aを持っています。そしてまた、私は

A:func()次のようにしかし、ときに私は、テーブルBにAとA.funcを保存し、その後、コールバックしようとする呼び出すことができ、 この A.func(A)ようA.funcを呼び出すことができます。エラーは「ゼロ値(メソッド 『V』)を呼び出すための 試み」だから

B = {} 
B[A] = A.func 

--call A.func 
k,v = next(B) 
k:v()--error happened here 
v(k)--no error occurred 

である、起こった、私はちょうど私がシンタックスシュガーを使用する場合、ここで何が起こっただろうか?

答えて

2

構文糖は

> A["func"](A) 
table: 009F7E58 
> A.func(A) 
table: 009F7E58 
> A:func() 
table: 009F7E58 

これらのコマンドは同等になりそうコマンドkを実行しようとします。v()それは「k個の[と同じですv "](k)。しかしあなたのテーブルkにはレコード "v"がなく、レコード "func"があります。だから、テーブルkのあなたあなたが見ることができるように

> k["func"](k) 
table: 009F7E58 

または

> v(k) 
table: 009F7E58 

または

> k:func() 
table: 009F7E58 

を実行することができ、変数 "V" は関数自体が含まれている、いない関数の名前。しかし、構文の砂糖を使用したい場合は、テーブル内の関数を持つレコードの名前を知る必要があります。

P.S.はい、あなたの例では "k"と "A"は同じテーブル(009F7E58)の名前です。

+0

ありがとうございました。 @Ruslan Rakhmanin – francis

1

k:v()vを使用すると、上記のローカル変数vには含まれません。 k:v()の構文では、オブジェクトkvという名前の関数を見つけるためにluaに指示し、それを実行し、kを最初のパラメータとして渡します。

別の例は、おそらくより良い、この挙動を示す:

k = {} 
function k.v(a) print(tostring(a))end 
local function v(a) print("local func called", a) end 
k:v() -- this method always call k.v function 
     -- no matter that variable with same name exists 
関連する問題