Muita gente andou me pedindo para que eu desse algumas dicas com Lua. Então, resolvi por meio dessa aula, dar dicas gerais de toda a linguagem.
Esse tutorial tem como objetivo apenas salientar alguns macetes e dicas legais para Lua tendo em vista que exista um mínimo conhecimento do assunto. Não responderei perguntas que julgo idiotas, portanto, nem tentem poluir esse tópico, se não sabe o que é Lua, procure no Google que é o melhor que você pode fazer. Desde já, desculpo me por minha antipatia por parte dos ignorantes.
Comentários
Além dos conhecidos comentários de linhas únicas iniciados por "-- comments go here" existem comentários de bloco, isto é, de multi linhas, representados por "--[[ comments go here]]".
Variáveis
Variáveis como o próprio nome já diz não são constantes, ou seja, o programador pode livremente mudar seus valores
Variáveis naturalmente são globais, mas podem se tornar locais colocando se antes do início da declaração "local"
O escopo de uma variável é limitada para o escopo atual e seus escopos-filhos
Não é recomendado debugar códigos usando variáveis locais pois estas são guardadas no stack e por isso é necessário funções como "assert" e outras
Uma variável local com mesmo nome de uma variável global apenas substitui o valor da global temporariamente (geralmente no tempo de sua execução, o que não chega a ser problema na maioria dos casos)
Tipos
Nil
Um valor especial que tem valor vazio e significa nulo (NULL)
Variáveis que são declaradas sem valor possuem valor igual a "nil" e podem ser modificadas livremente
Na maioria dos casos "nil" é retornado quando uma função falha
É possível usar uma alternativa ao "nil" usando "or" já que "nil" leva ao booleano "false": print(tonumber("a"), tonumber("a") or 1) -> prints "nil 1"
Boolean
Pode ter dois valores, true ou false. "Nil" funciona como false mas o número 0 funciona como true. Isso é bastante confundido por muitos
Number
Todos os números em Lua são valores "double float"
Variáveis podem ser convertidas em números pela função tonumber(var) que retorna "nil" caso falhe
Funções de manipulação de números são encontradas na biblioteca de matemática do Lua (math)
Strings
Strings podem receber os mesmos escapes da linguagem C (\n, \t, \0, etc)
Strings são internamente encriptadas pelo Lua, isso quer dizer que existe apenas uma única cópia de uma string em particular não importa quantas variáveis referem a essa string
Declarações que contam espaços em branco ou mesmo indicações de pular de linha e uso de tabulação podem ser pegos de forma mais dinâmica usando: string = [[Aqui eu escrevo sem me preocupar com nada e nem mesmo aspas, veja só: ' ""'"''" "]]
Strings podem ser concadenadas usando o operador ".."
Se existem muitas strings para serem concadenadas, o melhor jeito é inserir estas em uma tabela (usando table.insert()) e concadená-las (usando table.concat())
Variáveis podem ser convertidas em strings usando tostring(var) que retorna "nil" caso falhe
Tables
Tabelas podem ser indexadas por números, variáveis, funções, outras tabelas, funções, entre outros
Atribuindo um valor a um campo da tabela que não existe automaticamente cria esse campo
Ao invés de se usar a função table.getn(table) é possível pegar o número de elementos de uma tabela usando #table onde table é o nume da tabela
Não confunda table.getn(table) com table.maxn(table). Enquanto a primeira função retorna o número de elementos contido na tabela, o segundo retorna o maior valor numérico contido na tabela e retorna "nil" caso seja uma tabela formada por strings apenas
Ao contrário de outras linguagens, o número correspondente ao primeiro valor não é 0 e sim o valor 1
É possível remover valores e elementos de uma função atribuindo-lhes o valor "nil"
A tabela global se chama "_G" e você pode vê-la assim como as demais tabelas usando (k = key, v = value): for k, v in pairs(_G) do print(k, v) end
Userdatas
Userdatas são ponteiros do C/C++ que indicam objetos que não podem ser utilizados em Lua
Uma "metatable" pode ser um "userdata" para funcionar como uma tabela ou ser chamada como função, operadores próprios, entre outros
Functions
Uma função pode retornar múltiplos valores e podem ser atribuídas a várias variáveis
Funções podem ser colocadas em tabelas
Valores passados por funções são locais a não ser que sejam tabelas ou userdatas. Isso dá a oportunidade de modificar tabelas dentro de funções
Funções auxiliares (ou temporárias) podem ser criadas dentro de funções como locais
Switch
Muita gente me pergunta se existe uma função "switch" para case statements em Lua, a resposta é não. Mas, o uso de tabelas em funções podem simular esse efeito, veja:
Código:
switch = {}
switch[1] = function() print("Olá a todos") end
switch[2] = function() print("Meu nome é Yuji") end
-- ...
if (switch[1]) then
switch[1]() -- executa a função que diz "Olá a todos"
end
Loops
No loop "repeat .. until (bool)" não existe o "continue" pois o Lua automaticamente cuida disso. Apesar disso, existe o "break".
No loop "for ... do" existe um atribuito após o último valor para poder incrementar a variável assim como no PHP e C++
Mais dicas ainda estão por vir.