Ich bin verwirrt über den Unterschied zwischen Funktionsaufrufen über .
und über:
> 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
Was ist das :
?
Antworten:
Der Doppelpunkt dient zum Implementieren von Methoden, die
self
als erster Parameter übergeben werden. Alsox:bar(3,4)
sollte das gleiche sein wiex.bar(x,3,4)
.quelle
self
Objekt als erster Parameter und sein Eigenschaftenwert verwendet wird.object.method(object,args)
abgerufenobject
, während nur einmalobject:method(arg)
abgerufen wirdobject
. Wennobject
es sich um ein globales Feld, ein Upvalue-Feld oder ein Tabellenfeld handelt,:
ist es schneller als.
..
ist nie schneller als:
.Für die Definition ist es genau das Gleiche wie die manuelle Angabe von self - es wird sogar der gleiche Bytecode beim Kompilieren erzeugt. Dh
function object:method(arg1, arg2)
ist das gleiche wiefunction object.method(object, arg1, arg2)
.Bei Verwendung
:
ist fast das Gleiche wie.
- eine spezielle Art von Anruf wird intern verwendet, um sicherzustellen,object
dass mögliche Nebenwirkungen von Berechnungen / Zugriff nur einmal berechnet werden. Das Anrufenobject:method(arg1, arg2)
ist ansonsten dasselbe wieobject.method(object, arg1, arg2)
.quelle
Um ganz genau zu sein,
obj:method(1, 2, 3)
ist das gleiche wieWarum die lokale Variable? Weil, wie viele darauf hingewiesen haben,
obj:method()
nur_ENV
einmal Indizes abgerufen werden müssenobj
. Dies ist normalerweise nur wichtig, wenn Sie die Geschwindigkeit berücksichtigen. Beachten Sie jedoch die folgende Situation:Stellen
__index
Sie sich nun vor, die Metamethode hat mehr als nur etwas gedruckt. Stellen Sie sich vor, es würde einen Zähler erhöhen, etwas in einer Datei protokollieren oder einen zufälligen Benutzer aus Ihrer Datenbank löschen. Es gibt einen großen Unterschied, ob man das zweimal oder nur einmal macht. In diesem Fall gibt es einen deutlichen Unterschied zwischenobj.method(obj, etc)
undobj:method(etc)
.quelle