GDLib 2 #1 Posted December 13, 2008 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: 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. Share this post Link to post
Mephisto 0 #2 Posted December 13, 2008 Aee tiu Nostra mandando umas aulas ai Cada vez mais eu me entereço por scripting, quem sabe um dia eu viro um? >.< Obrigado pela contribuição, ótima aula! Share this post Link to post
MotoBoy 0 #3 Posted December 14, 2008 pocha nostradamus.. eu li tudo.. muita coisa mesmo eu nem fazia idéia >.< mais consegui trar uma boa lição excelente aula!! realmente, mereceu o lugar nos destaques! obrigado ^^ flws~~ Share this post Link to post
Eventide 7 #4 Posted December 14, 2008 eu tenho uma duvida, pra que serve o do ? :S Share this post Link to post
MotoBoy 0 #5 Posted December 14, 2008 o "do" serve como o "then" do "for" agora nas funções secundárias acho que só serve mesmo pra chamar a função x.x pelo que eu saiba não tem outra função =O~~ aliás.. acredito que é usado também em algum outro loop.. flws~~ Share this post Link to post
lyndell 0 #6 Posted December 15, 2008 For to do, é usado para vetores... exemplo for i = 1 to 100 do açao end em pascal é assim, acredito que em lua tabem... é muito util para com grandes quantidades. Share this post Link to post
Eventide 7 #7 Posted December 15, 2008 o do não serve só para os loops eu acho... O.O outra coisa: quando devo declarar algo como local e quando não devo ? Share this post Link to post
MotoBoy 0 #8 Posted December 15, 2008 sauhsuahsuha Eventide.. acho todo mundo deve ter esta duvida.. mais acredito que eu possa (tentar) explicar para você, do jeito que me explicaram no suporte.. quando voce declara ela como local, ela passa a ter o valor de uma outro global de mesma variável.. exemplo: a global eh: skill = getPlayerStorageValue (123) então se vc usar skill em um outro script, sem declrar a variável, ele vai ter essa função.. agora para vc fazer essa variável fazer outra coisa vc declara ela como local.. tpw: local skill = getPlayerMagLvl como ela é local, ela passa a ter esta valor de PlayerMagLvl.. ´MAIS SÓ NESSE SCRIPT em qualquer outro scriptque você colocar skill sem declarar, ela vai ter a valor da global de novo.. espero que dÊ pra entender.. flws~~ Share this post Link to post
Deragon 25 #9 Posted December 20, 2008 local, como diz o nome, serve apenas paraw o local do script, ou seja, apenas para o script que está declarado... não sei quem me explicou isso, nao sei se esta certo Share this post Link to post
Marcelo Côrtes 0 #10 Posted December 22, 2008 O do tem outras funções sim; não é apenas no loop for. do doPlayerAddStackable = doPlayerAddItem --Returns table with UIDs of added items doPlayerAddItem = function(cid, itemid, amount, subType, ignoreCap, inBackpacks) local amount = amount or 1 local subType = subType or 0 local ignoreCap = ignoreCap and TRUE or FALSE if(isItemStackable(itemid) == TRUE) then return doPlayerAddStackable(cid, itemid, amount, ignoreCap), amount end local items = {} local ret = 0 local a = 0 for i = 1, amount do items = doCreateItemEx(itemid, subType) ret = doPlayerAddItemEx(cid, items, ignoreCap) if(ret ~= RETURNVALUE_NOERROR) then break end a = a + 1 end return items, a end end data/npc/lib/npc.lua Pelo "contexto" acredito que ele executa isso internamente. Great topic. Até ajudo ^^ (o que é concadenar? u.u isso nem existe no dicionário) Share this post Link to post
Eventide 7 #11 Posted December 22, 2008 @cortesx você quis dizer concatenar ? Share this post Link to post
MotoBoy 0 #12 Posted December 22, 2008 cara.. além do loop cara o do só tem a função de "chamar" a função secundária ¬¬" eu tinha dito isso lol flws~~ Share this post Link to post
Eventide 7 #13 Posted December 22, 2008 lol então se eu tenho declarado no script uma função chamada MeuNome(), eu precisarei de um do para chama-la ? O.O eu acho que para chamar funções é só escrever o nome dela, no caso MeuNome() já executa a função Mas esse do não me parece muito util, eu já perguntei para que servia para alguns scripters de fama e boa reputação na otnet e estes não souberam responder.. Share this post Link to post
MotoBoy 0 #14 Posted December 23, 2008 hmm.. mais geralmente, algumas ds funç~eos secundárias precisam do Do cara Oo tipo.. se vc escrever num script: addEvent (etc e tal) oque acontece???????? e se eu escrever: do addEvent (etc e tal) oque acontece???????? =P sem o do o addEvent porexemplo não funciona =P flws~~ Share this post Link to post
Kaotar 5 #15 Posted December 25, 2008 Eventid_: Declarar uma variavel como local ira botar o valor da variavel X ao valor declarado somente no local e caso tenha uma global com o mesmo nome nao alterando ela. Ex: local x = 10 if x == 10 then local x = x+1 print(x) end print(x) --[[Resultado: 11 10]] Share this post Link to post
PoSo 0 #16 Posted December 25, 2008 (edited) o do não serve só para os loops eu acho... O.O outra coisa: quando devo declarar algo como local e quando não devo ? Existe, além do DO usado em loops, o DO - END, que é um bloco que pode ser útil quando voce precisa de um controle mais preciso sobre o escopo de uma ou mais variáveis locais: do local a2 = 2*a local d = sqrt(b^2 - 4*a*c) x1 = (-b + d)/a2 x2 = (-b - d)/a2 end -- escopo de 'a2' e 'd' acaba aqui print(x1, x2) Sobre a questão de variaveis locais, como ja disse elas têm seu escopo limitados ao bloco onde elas foram declaradas.. sem dizer que o acesso a variáveis locais é bem mais rápido do que a variáveis globais... Seu uso, pode ser, por exemplo, quando voce deseja utilizar o valor de um variável global, mas não quer que se altere, então, você cria uma local e a modifica do jeito que desejar: x = 10 --global local z = x --z=10 z = z - 3 print(z) Se estiver errado, por favor, me corrijam.. @Topic Muito boa a iniciativa, mesmo contendo alguns erros gramaticais, aula muito bem construida Abraços. Edited January 24, 2011 by Mickfern Share this post Link to post
Raphael Carnaúba 1 #17 Posted December 25, 2008 EVentide, é como no C++ se você lembrar. [b][color=Black]int[/color][/b] x = 0;[color=SandyBrown] [/color][color=SandyBrown]// a variavel X foi criada.[/color] [color=Blue]printf[/color]([color=SandyBrown]"%d"[/color], x); [b]int[/b] x = 5; [color=SandyBrown]// criar outro X é resultante de conflito por multiplas declaracoes.[/color] x = 5; [color=SandyBrown]// modo correto de se fazer.[/color] Share this post Link to post
Eventide 7 #18 Posted December 25, 2008 (edited) sobre as variáveis eu entendi, o que me intriga é o do... @poso escopo pra mim é isso: function allalalal() --code ( escopo 1 ) if blah = bla then -- code ( escopo 2 ) end --code ( escopo 1 ) if uhu = uhul then --code ( escopo 2 ) if lah ~= la then --code ( escopo 3 ) end --code ( escopo 2 ) end --code ( escopo 1 ) end escopo é algo completamente inútil.. Edited January 24, 2011 by Mickfern Share this post Link to post
PoSo 0 #19 Posted December 25, 2008 sim, dentro de um escopo se for criada uma variavel local, ela ficará restritamente naquele escopo(local¬¬) quando sair do escopo, ela não existe mais.. Share this post Link to post
Eventide 7 #20 Posted December 25, 2008 ah tá, entendi o seu raciocínio, mas de qualquer forma, o do continua sendo algo meio que completamente inútil.. xD Share this post Link to post