Ir para conteúdo
Entre para seguir isso  
GDLib

Dicas essenciais em Lua

Recommended Posts

GDLib    2
GDLib

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.

Compartilhar este post


Link para o post
Mephisto    0
Mephisto

Aee tiu Nostra mandando umas aulas ai :D

Cada vez mais eu me entereço por scripting, quem sabe um dia eu viro um? >.<

 

Obrigado pela contribuição, ótima aula!

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

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~~

Compartilhar este post


Link para o post
Eventide    7
Eventide

eu tenho uma duvida, pra que serve o do ? :S

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

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~~

Compartilhar este post


Link para o post
lyndell    0
lyndell

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.

Compartilhar este post


Link para o post
Eventide    7
Eventide

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 ?

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

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~~

Compartilhar este post


Link para o post
Deragon    25
Deragon

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

Compartilhar este post


Link para o post
Marcelo Côrtes    0
Marcelo Côrtes

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)

Compartilhar este post


Link para o post
Eventide    7
Eventide

@cortesx

você quis dizer concatenar ?

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

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~~

Compartilhar este post


Link para o post
Eventide    7
Eventide

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 :D

 

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.. :P

Compartilhar este post


Link para o post
MotoBoy    0
MotoBoy

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~~

Compartilhar este post


Link para o post
Kaotar    5
Kaotar

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]]

Compartilhar este post


Link para o post
PoSo    0
PoSo
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.

Editado por Mickfern

Compartilhar este post


Link para o post
Raphael Carnaúba    1
Raphael Carnaúba

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]

Compartilhar este post


Link para o post
Eventide    7
Eventide

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.. :o

Editado por Mickfern

Compartilhar este post


Link para o post
PoSo    0
PoSo

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..

Compartilhar este post


Link para o post
Eventide    7
Eventide

ah tá, entendi o seu raciocínio, mas de qualquer forma, o do continua sendo algo meio que completamente inútil.. xD

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×