Je ne comprends pas la différence entre les appels de fonction via .
et via:
> 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
Que :
fait-on?
Réponses:
Les deux points servent à implémenter des méthodes qui passent
self
comme premier paramètre. Doncx:bar(3,4)
devrait être le même quex.bar(x,3,4)
.la source
self
objet ira comme premier paramètre et sa valeur de propriétés.object.method(object,args)
récupèreobject
deux fois, tandis queobject:method(arg)
récupèreobject
une seule fois. Siobject
est un champ global, upvalue ou table, alors:
est plus rapide que.
..
n'est jamais plus rapide que:
.Pour la définition, c'est exactement la même chose que de spécifier soi manuellement - cela produira même le même bytecode lors de la compilation. Ie
function object:method(arg1, arg2)
est le même quefunction object.method(object, arg1, arg2)
.L'utilisation
:
est presque la même que.
- un type spécial d'appel sera utilisé en interne pour s'assurer queobject
tous les effets secondaires possibles des calculs / accès ne sont calculés qu'une seule fois. L'appelobject:method(arg1, arg2)
est par ailleurs le même queobject.method(object, arg1, arg2)
.la source
Pour être tout à fait précis,
obj:method(1, 2, 3)
équivaut àPourquoi la variable locale? Parce que, comme beaucoup l'ont souligné, les
obj:method()
index ne sont disponibles qu'une seule_ENV
foisobj
. Ceci est normalement juste important lors de l'examen de la vitesse, mais considérez cette situation:Imaginez maintenant que la
__index
métaméthode a fait plus que simplement imprimer quelque chose. Imaginez qu'il augmente un compteur, enregistre quelque chose dans un fichier ou supprime un utilisateur aléatoire de votre base de données. Il y a une grande différence entre faire cela deux fois ou une seule fois. Dans ce cas, il y a une nette différence entreobj.method(obj, etc)
etobj:method(etc)
.la source