Ir para conteúdo
Entre para seguir isso  
Socket

Função string.concat

Recommended Posts

Socket    0
Socket

Bem, como rotina dos meus post, a história :palm:

Lá estava eu, o bonitão Socket, quando vem a ideia de criar uma função em que as strings e variáveis se auto-concatenam, claro se a variavel estiver entre velhas(#).

Antes de mostrar a função vo explicar seu funcionamento hehe ' como eu queria do geito POG

Passo por passo hein

 

  1. A função separa todas as variávels e coloca em uma tabela, var.
  2. A função passa um laço na tabela var e verifica se a variavel é simples, exemplo (nome), ou complexa, exemplo (tabela.nome)
  3. Se a variavel for simples, a função simplesmente faz um string.gsub e passa para a próxima variável. Caso ao contrário, a função usa avançados métodos POG powered, que apenas Pogger Masters, como o Flatronez, o Mock, e infelizmente Eu (:/) são capazes de utilizar.
  4. E então string.gsub-a tudo.

[spoiler=Script]

function string.concat(e)
   function checkVarType(e)
       if ((e:find("%.")) or (e:find("%[") )) then
           return 1
       end

       return 0
   end

   function tostr(s)
       if (s:sub(1,1) == '\'' or s:sub(1,1) == '"') then
           return s:sub(2,-2)
       end

       return s
   end

   function string:strip()
       if (self:find("%[")) then
           self = self:gsub("%[", "%%[")
       end

       if (self:find("%.")) then
           self = self:gsub("%.", "%%.")
       end

       return self
   end

   local var = {}

   for match in e:gmatch("#(.-)#") do
       table.insert(var, match)
   end

   for index, match in ipairs(var) do
       local matchType = checkVarType(match)
       if (matchType == 0) then
           local rep = _G[match]
           e = e:gsub("#" .. match .. "#", tostring(rep))
       else
           local indexS
           for index = 1, #match do
               local mac = match:sub(index, index)
               if (mac == "." or mac == "[") then
                   indexS = mac
                   break
               end
           end

           local iS, iN = match:find("%" .. indexS)

           local indexEx, indexSn = match:sub(1, iS-1), match:sub(iN, -1)

           if (indexSn:find("%.") or indexSn:find("%[")) then
               local n = 0
               for matchEx in indexSn:gmatch("%.") do
                   n = n+1
               end

               for matchEx in indexSn:gmatch("%[") do
                   n = n+1
               end

               local str = indexSn
               local dir = _G[indexEx]

               function getNext(str)
                   local list = {["."] = true, ["["] = true}
                   for i = 1, #str do
                       if list[str:sub(i,i)] then
                           return str:sub(i,i)
                       end
                   end
               end

               for counter = 1, n do
                   local nextS = getNext(str)
                   if (counter < n) then
                       iS, iN = str:find("%" .. nextS)

                       local param = str:sub(1, iN+1)
                       local param = str:find("%]") and param:sub(1, str:find("%]")-1) or param:sub(1, str:find("%.")+1)
                       local param = param:sub(1, iS) == nextS and param:sub(iS+1) or param
                       local param = tostr(param)
                       local param = type(tonumber(param)) == "number" and tonumber(param) or param


                       nDir = dir[param]
                       if (not nDir) then
                           return param, 'w'
                       end

                       dir = nDir
                       str = str:match("%[" .. param .. "%](.+)") or str:match("%." .. param .. "(.+)")
                   else
                       if (not nextS) then
                           local param = tostr(str)
                           local param = type(tonumber(str)) == "number" and tonumber(str) or str

                           nDir = dir[param]
                           if (not nDir) then
                               return nil
                           end
                           dir = nDir

                           e = e:gsub("#" .. match:strip() .. "#", dir)
                       else
                           local iS, iN = str:find("%" .. nextS)
                           local param = str:match("%[(.-)%]") and str:sub(2, -2) or str:sub(2)
                           local param = tostr(param)
                           local param = type(tonumber(param)) == "number" and tonumber(param) or param


                           nDir = dir[param]
                           if (not nDir) then
                               return nil
                           end
                           dir = nDir

                           e = e:gsub("#" .. match:strip() .. "#", dir)
                       end
                   end
               end
           else
               local indexSn = indexSn:sub(1,-2)
               local indexSn = type(tonumber(indexSn)) == "number" and tonumber(indexSn) or indexSn
               e = e:gsub("#" .. match:strip() .. "#", _G[indexEx][indexSn] or '')
           end
       end
   end

   return e
end

 

 

E claro, uma pequena demonstração de como usá-la:

 

list = {
                       name = "Socket",
                       age = 11,
                       vocation = "Pog Master",                                       
}
print(string.concat("Hello, my name's #list.name#, I'm #list.age# years old and I'm a #list.vocation#."))

 

Obs: O script foi mais feito para superação pessoal no quesito Pogger.

Obs1: Apenas funciona em variáveis GLOBAIS.

Obs2: Nao tem tratamento de erro, caso haja uma variavel que nao existe, simplesmente retorna nil, simples não? :loool:

 

Aleluia arrumaram o Lua Code.

Editado por Mickfern

Compartilhar este post


Link para o post
Compartilhar em outros sites
Conde2    0
Conde2

Socket você conseguiu parabéns cara !!!

Mas ninguem supera meus pogs cara XD

 

Então em APENAS 1 linha eu fiz o que você fez em 124 =)

Desculpa mas acho que essa eu me sai melhor...

 

b = "Você"
A =  "gay"
function formateString(str)
   return(str:gsub("|(.-)|", (function(a) func = loadstring('return '..a) return func() end)))
end
 print(formateString("|b| é |A|"))

Editado por Mickfern

Compartilhar este post


Link para o post
Compartilhar em outros sites
Socket    0
Socket
Socket você conseguiu parabéns cara !!!

Mas ninguem supera meus pogs cara XD

 

Então em APENAS 1 linha eu fiz o que você fez em 124 =)

Desculpa mas acho que essa eu me sai melhor...

 

b = "Você"
A =  "gay"
function formateString(str)
   return(str:gsub("|(.-)|", (function(a) func = loadstring('return '..a) return func() end)))
end
 print(formateString("|b| é |A|"))

 

Lol, que eu saiba o meu é o Pog Powered haha.

 

Se você não leu, eu escolhi o caminho POG.

 

Obs: O script foi mais feito para superação pessoal no quesito Pogger.
Editado por Mickfern

Compartilhar este post


Link para o post
Compartilhar em outros sites
Notorious    1
Notorious

É, eu ainda prefiro usar printf()

Mas apesar de tantas linhas ficou boa a função sim nao li nem metade

Compartilhar este post


Link para o post
Compartilhar em outros sites
Mock    32
Mock

function doMock(s)
     return string.format(string.rep('%s',#s),unpack(s))
end

pronto :coolface:

Editado por Mickfern

Compartilhar este post


Link para o post
Compartilhar em outros sites
nogareD    0
nogareD

pogs, pogs

e a frase embaixo do seu avatar seria "are you..."

Compartilhar este post


Link para o post
Compartilhar em outros sites
Conde2    0
Conde2

@Mock

 

Seu urso desgramado não precisa humilhar né ¬¬

Tu é foda ursão entra no msn cara se ta sumido lá

 

@EDIT

Tem +/- haver sim socket

só que é em tabelas tipo

 

function doMock(s)
     return string.format(string.rep('%s',#s),unpack(s))
end



print(doMock({"oi","oi"}))

Editado por Mickfern

Compartilhar este post


Link para o post
Compartilhar em outros sites
Socket    0
Socket

É, o Mock não entendeu o objetivo da função, pois ele fez uma função que nao tem nada a ver com o meu pog a minha função e a função do conde.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Mock    32
Mock

Ah nao eu revi a funçao la do socket

ele printa tipo

tabela.var

agora entendi.

da pra diminuir mais n vai fica menor q umas 70 isso eu tenho ctz

Compartilhar este post


Link para o post
Compartilhar em outros sites
Conde2    0
Conde2

@Mock

 

Meu amigo mock eu fiz em apenas 1 linha =P

Como você me fala uma coisas dessaS?

ahhahahaha

Editado por Conde2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Kaotar    5
Kaotar

Realmente o Conde2 recriou bem sua função...

Da pra mudar um detalhe ainda.

b = "Você"
A =  "gay"
function formateString(str)
   return(str:gsub("|(.-)|", (function(a) return loadstring('return '..a)() end)))
end
 print(formateString("|b| é |A|"))

Editado por Mickfern

Compartilhar este post


Link para o post
Compartilhar em outros sites
Socket    0
Socket
@Mock

 

Meu amigo mock eu fiz em apenas 1 linha =P

Como você me fala uma coisas dessaS?

ahhahahaha

 

Cara, acho que você não percebeu porque eu fiz isso.

A questão não é tamanho e sim a idéia.

Da pra fazer com loadstring, e até um rings com um dofile no mesmo arquivo.

 

Só que eu queria fazer para ele pegar no global environment manualmente, entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

×