La différence entre les deux . et : en Lua
Je suis confus au sujet de 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
Quel est le :
faire ?
- Connexes: stackoverflow.com/questions/3779671/...
Vous devez vous connecter pour publier un commentaire.
Le côlon pour la mise en œuvre des méthodes qui passent
self
en tant que premier paramètre. Doncx:bar(3,4)
doit être le même quex.bar(x,3,4)
.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
qu'une seule fois. Siobject
est une mondial, amont ou des champs de la table, puis:
est plus rapide que.
..
n'est jamais plus vite que:
.Pour la définition, c'est exactement le même que pour la définition de soi manuellement - il va même jusqu'à produire même bytecode sur la compilation. I. e.
function object:method(arg1, arg2)
est la même quefunction object.method(object, arg1, arg2)
.Sur l'utilisation
:
est presque le même que.
- un type particulier de l'appel sera utilisé en interne afin de s'assurer queobject
et les éventuels effets secondaires des calculs et des accès sont calculés qu'une seule fois. L'appel deobject:method(arg1, arg2)
est le contraire même queobject.method(object, arg1, arg2)
.Pour être totalement précis,
obj:method(1, 2, 3)
est le même quePourquoi la variable locale? Parce que, comme beaucoup l'ont souligné,
obj:method()
seulement indices_ENV
fois pour obtenirobj
. Ce normalement juste important lors de l'examen de la vitesse, mais considère que cette situation:Maintenant, imaginez la
__index
metamethod a fait plus que juste l'impression de quelque chose. Imaginez, il a augmenté d'un compteur, enregistré quelque chose sur un fichier ou supprimé un utilisateur aléatoire à partir de votre base de données. Il y a une grande différence entre faire que deux fois ou une seule fois. Dans ce cas, il y a une nette différence entreobj.method(obj, etc)
etobj:method(etc)
.