2011-02-06 18 views
112

Estoy confundido acerca de la diferencia entre las llamadas de función a través de . ya través de :Diferencia entre. y: en Lua

> 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 

¿Cuál es el : haciendo?

+1

Relacionados: http://stackoverflow.com/questions/3779671/why-cant-i-use-setunion-instead-of-set-union – finnw

Respuesta

159

La coma sirve para implementar métodos que pasan self como primer parámetro. Por lo tanto, x:bar(3,4) debe ser el mismo que x.bar(x,3,4).

+26

ah ... así que es azúcar sintáctico orientado a objetos. –

+5

Exactamente. En el manual de referencia completo, la única nota que dan sobre esto es "La sintaxis de dos puntos se usa para definir métodos, es decir, funciones que tienen un parámetro extra implícito propio". (Manual 5.0, parte inferior de la página en pdf 19) – BMitch

+2

ooh ahh ... Iba a preguntar dónde estaban los documentos oficiales, pero me pegaste. bien hecho. :-) –

19

Para la definición es exactamente lo mismo que especificar manualmente, incluso producirá el mismo bytecode en la compilación. Es decir. function object:method(arg1, arg2) es igual que function object.method(self, arg1, arg2).

El uso : es casi lo mismo que . - un tipo especial de llamada se utiliza internamente para asegurarse object y los posibles efectos secundarios de los cálculos/acceso se calculan sólo una vez. Llamar a object:method(arg1, arg2) es lo mismo que object.method(object, arg1, arg2).