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
selfcomo primer parámetro. Entoncesx:bar(3,4)debería ser lo mismo quex.bar(x,3,4).fuente
selfobjeto que irá como primer parámetro y su valor de propiedades.object.method(object,args)recuperaobjectdos veces, mientras queobject:method(arg)recuperaobjectsolo una vez. Siobjectes 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 queobjectlos 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_ENVuna vez para obtenerobj. Esto normalmente solo es importante cuando se considera la velocidad, pero considere esta situación:Ahora imagine que el
__indexmetametodo 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