2011-02-06 4 views
112

に私が.経由してやっ:何ですか:の違い。そして、:Luaの

> x = {foo = function(a,b) return a end, bar = function(a,b) return b end, } 
> return x.foo(3,4) 
3 
> return x.bar(3,4) 
4 
> return x:foo(3,4) 
table: 0x10a120 
> return x:bar(3,4) 
3 

を経由して、関数呼び出しの違いについて混乱していますか?

+1

関連:http://stackoverflow.com/questions/3779671/why-cant-i-use-setunion-instead-of-set-union – finnw

答えて

159

コロンは、最初のパラメータとしてselfを渡すメソッドを実装するためのものです。したがってx:bar(3,4)x.bar(x,3,4)と同じにする必要があります。

+26

ああ...オブジェクト指向の構文的砂糖です。 –

+5

正確に。全体のリファレンスマニュアルでは、これに与えられる唯一の洞察力は、「コロン構文はメソッドを定義するために使用されます。つまり、暗黙の余分なパラメータselfを持つ関数」です。 (5.0マニュアル、pdf 19ページの下に) – BMitch

+2

ooh ahh ...私は公式の文書がどこにあるのか尋ねるつもりでしたが、あなたはそれに私を打ちました。うまくやった。 :-) –

19

定義のためには、正確にと同じです。これは、手動での指定と同じです。コンパイル時に同じバイトコードが生成されることさえあります。私。 function object:method(arg1, arg2)function object.method(self, arg1, arg2)と同じです。使用:

.としてほとんど同じである - コールの特別な種類がobjectを確認するために内部的に使用され、計算/アクセスのいずれかの可能性のある副作用は一度だけ計算されます。 object:method(arg1, arg2)は、object.method(object, arg1, arg2)と同じです。

関連する問題