Estou confuso sobre a diferença entre chamadas de função via .
e 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
O que está :
fazendo?
Respostas:
Os dois pontos são para implementar métodos que passam
self
como o primeiro parâmetro. Entãox:bar(3,4)
deve ser o mesmo quex.bar(x,3,4)
.fonte
self
objeto que será o primeiro parâmetro e seu valor de propriedades.object.method(object,args)
recuperaobject
duas vezes, enquantoobject:method(arg)
recuperaobject
apenas uma vez. Seobject
for um campo global, de valor superior ou de tabela,:
será mais rápido que.
..
nunca é mais rápido que:
.Para definição, é exatamente o mesmo que especificar manualmente - ele até produzirá o mesmo bytecode na compilação. Ou seja,
function object:method(arg1, arg2)
é o mesmo quefunction object.method(object, arg1, arg2)
.O uso
:
é quase o mesmo que.
- um tipo especial de chamada será usado internamente para garantir queobject
todos os possíveis efeitos colaterais dos cálculos / acesso sejam calculados apenas uma vez. Chamarobject:method(arg1, arg2)
é o mesmo queobject.method(object, arg1, arg2)
.fonte
Para ser completamente preciso,
obj:method(1, 2, 3)
é o mesmo quePor que a variável local? Porque, como muitos apontaram,
obj:method()
apenas os índices são obtidos_ENV
uma vezobj
. Isso normalmente é importante ao considerar a velocidade, mas considere esta situação:Agora imagine que o
__index
metamétodo fez mais do que apenas imprimir algo. Imagine que ele aumentou um contador, registrou algo em um arquivo ou excluiu um usuário aleatório do seu banco de dados. Há uma grande diferença entre fazer isso duas ou apenas uma vez. Nesse caso, há uma clara diferença entreobj.method(obj, etc)
eobj:method(etc)
.fonte