回答:
コロンはself
、最初のパラメーターとして渡すメソッドを実装するためのものです。したがってx:bar(3,4)
、と同じである必要がありx.bar(x,3,4)
ます。
self
最初のパラメータとそのプロパティ値として行くオブジェクトに依存します。
object.method(object,args)
取得するようなドット構文は1回しか取得しません。がグローバル、アップバリュー、またはテーブルフィールドの場合は、よりも高速です。よりも速くなることはありません。object
object:method(arg)
object
object
:
.
.
:
定義については、自分で手動で指定するのとまったく同じです。コンパイル時に同じバイトコードが生成されることもあります。すなわちfunction object:method(arg1, arg2)
と同じfunction object.method(object, arg1, arg2)
です。
使用時:
はほぼ同じです.
-特別な種類の呼び出しが内部で使用され、確認object
と計算/アクセスの可能性のある副作用が1回だけ計算されます。object:method(arg1, arg2)
それ以外の呼び出しはと同じobject.method(object, arg1, arg2)
です。
完全に正確にobj:method(1, 2, 3)
は、と同じです
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
なぜローカル変数なのか?多くの人が指摘したように、一度取得するのは一度obj:method()
だけ_ENV
ですobj
。これは通常、速度を考慮するときに重要ですが、次の状況を考慮してください。
local tab do
local obj_local = { method = function(self, n) print n end }
tab = setmetatable({}, {__index = function(idx)
print "Accessing "..idx
if idx=="obj" then return obj_local end
end})
end
tab.obj.method(tab.obj, 20)
--> Accessing obj
--> Accessing obj
--> 20
tab.obj:method(10)
--> Accessing obj
--> 10
__index
メタメソッドが単に何かを出力する以上のことを想像してください。カウンターを増やしたり、何かをファイルに記録したり、データベースからランダムなユーザーを削除したりしたとします。これを2回行うか1回だけ行うかには大きな違いがあります。この場合、との間には明らかな違いがobj.method(obj, etc)
ありobj:method(etc)
ます。