Estoy confundido acerca de la diferencia entre llamadas de función vía .
y vía:
> 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 esta :
haciendo
Respuestas:
Los dos puntos son para implementar métodos que pasan
self
como primer parámetro. Entoncesx:bar(3,4)
debería ser lo mismo quex.bar(x,3,4)
.fuente
self
objeto que irá como primer parámetro y su valor de propiedades.object.method(object,args)
recuperaobject
dos veces, mientras queobject:method(arg)
recuperaobject
solo una vez. Siobject
es un campo global, de valor superior o de tabla, entonces:
es más rápido que.
..
nunca es más rápido que:
.Por definición, es exactamente lo mismo que especificarse manualmente, incluso producirá el mismo código de bytes en la compilación. Es decir
function object:method(arg1, arg2)
es lo mismo quefunction object.method(object, arg1, arg2)
.El uso
:
es casi lo mismo que.
: se utilizará un tipo especial de llamada internamente para asegurarse de queobject
los posibles efectos secundarios de los cálculos / acceso se calculen solo una vez. Llamarobject:method(arg1, arg2)
es lo mismo queobject.method(object, arg1, arg2)
.fuente
Para ser completamente preciso,
obj:method(1, 2, 3)
es lo mismo que¿Por qué la variable local? Porque, como muchos han señalado,
obj:method()
solo indexa_ENV
una vez para obtenerobj
. Esto normalmente solo es importante cuando se considera la velocidad, pero considere esta situación:Ahora imagine que el
__index
metametodo hizo más que simplemente imprimir algo. Imagine que aumenta un contador, registra algo en un archivo o elimina un usuario aleatorio de su base de datos. Hay una gran diferencia entre hacerlo dos veces o solo una vez. En este caso, hay una clara diferencia entreobj.method(obj, etc)
yobj:method(etc)
.fuente