Ir para conteúdo

Biblioteca Auxiliar String


dalvorsn

Posts Recomendados

Autor: Dalvo

Descrição: Constam nessa lib funções atribuidas a chamada de metamétodos.

 

 

Biblioteca Auxiliar String

divisor.png

aNs7gidD[/pastebin]

 

Exemplos de Uso

divisor.png

• Metamétodo __index:

Input:

local str = "xtibia123"
print(str[1], str[2], str[3], str[4], str[5], str[6])

local table_find = str["x(.+)"]
print(table_find.init, table_find.final, table_find.ret)

Output:

>lua -e "io.stdout:setvbuf 'no'" "teste.lua"
x t i b i a

1 9 tibia123

 

• Metamétodo _unm:

Input:

local str = "xtibia"
print(-str)

Output:

>lua -e "io.stdout:setvbuf 'no'" "teste.lua"
aibitx

 

• Metamétodo __call:

Input:

local var = "xtibia"
print(var(1), var(1,-1), var(1,3))

Output:

>lua -e "io.stdout:setvbuf 'no'" "teste.lua"
x xtibia xti

 

• Metamétodo __add:

Input:

print("x" + "tibia")

Output:

>lua -e "io.stdout:setvbuf 'no'" "teste.lua"
xtibia

 

• Metamétodo __sub:

Input:

print("xtibia" - "tibia")

Output:

>lua -e "io.stdout:setvbuf 'no'" "teste.lua"
x

 

• Metamétodo __mul:

Input:

print("xtibia" * 5)

Output:

>lua -e "io.stdout:setvbuf 'no'" "teste.lua"
xtibiaxtibiaxtibiaxtibiaxtibia

Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

Caramba, sensacional. Pra ser sincero, eu nem sabia que tinha um jeito de fazer operações com as strings.

 

É possível fazer com outros valores? Usando os metamétodos?

 

Sim, number, só que o procedimento é um pouco diferente.


debug.setmetatable(0, {
 __index = function(self, key) print(self, key) end,
 __len = function(self) print(self) end,
 __call = function(self, ...) print(self, ...) end
 --etc
})

local _ = #(1000)
local _ = (1000)("arg1", "arg2")
local _ = (1000)[500]

 

Dependendo da sua criatividade, da pra fazer algo legal para os numeros :>

Bollean, table, function não consegui fazer, userdata e thread não tentei.

 

#Edit

Corrigindo, consegui agora usar com function, mas por algum motivo que desconheço, o metodo __call não altera.


debug.setmetatable(function()end, {
 __index = function(self, key) print(self, key) end,
 __len = function(self) print(self) end,
 __call = function(self, ...) print(self, ...) end
 --etc
})

function new() print "vish" end
local _ = new[1]
local _ = #new
local _ = new()

seria interesante com tables(comparação,soma,subtração,etc),isso seria possivel?

 

Não, porque o tipo table tem metatable independente, cada tabela pode possuir sua própria metatable.

Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

Nossa Dalvo, só tenho uma coisa a te falar cara: Meus parabéns, ótimo jeito de utilizar os metamétodos, ficou muito legal bro, na boa [:.

 

Me add no Skype depois bro '-': MaXwEllDeN

ty e tá add la flor

Link para o comentário
Compartilhar em outros sites

Não, porque o tipo table tem metatable independente, cada tabela pode possuir sua própria metatable.

eu pensei num metodo pra isso,mas é meio pog e falho, da pra atribui uma metatable a _G e usa newindex pra checa o type e atribui uma mettable,mas n funciona em variaveis locais e se reafirma a varivel ela fica sem metatable.

Link para o comentário
Compartilhar em outros sites

Não, porque o tipo table tem metatable independente, cada tabela pode possuir sua própria metatable.

eu pensei num metodo pra isso,mas é meio pog e falho, da pra atribui uma metatable a _G e usa newindex pra checa o type e atribui uma mettable,mas n funciona em variaveis locais e se reafirma a varivel ela fica sem metatable.

Até entendi seu ponto de vista, acho que poderia até dar certo, mas o trabalho que daria fora a quantidade de bugs poderia tornar inviavel. Assim que puder tentarei fazer isso e lhe digo se é viável ou não.

Link para o comentário
Compartilhar em outros sites

Até entendi seu ponto de vista, acho que poderia até dar certo, mas o trabalho que daria fora a quantidade de bugs poderia tornar inviavel. Assim que puder tentarei fazer isso e lhe digo se é viável ou não.

funciona,funciona o problema é que n funciona em em locais e quando re-utiliza uma varivel

para as locais daria pra cria uma varivel antes e iguala a local a varivel

eu tinha feito poucos teste,mas fora isso n vi nenhum bug,vo da mais umas testas

outro problema e quando usa algo do tipo {{}},tbm fica sem mesmo usando newindex na nova tabela

Editado por lordbug99
Link para o comentário
Compartilhar em outros sites

Até entendi seu ponto de vista, acho que poderia até dar certo, mas o trabalho que daria fora a quantidade de bugs poderia tornar inviavel. Assim que puder tentarei fazer isso e lhe digo se é viável ou não.

funciona,funciona o problema é que n funciona em em locais e quando re-utiliza uma varivel

para as locais daria pra cria uma varivel antes e iguala a local a varivel

eu tinha feito poucos teste,mas fora isso n vi nenhum bug,vo da mais umas testas

outro problema e quando usa algo do tipo {{}},tbm fica sem mesmo usando newindex na nova tabela

 

fiz inumeros testes aqui e nenhum teve êxito total

quando declarar a variavel como global da pra setar newindex, e nas de dentro é só verificar se é table e setar e nas tables das tables dentro, isso não é o problema, o problema é quando ou a tabela é declarada como local, ou é simplesmente usada, sem previamente declarar:

local tab = {}
print(tab * {})
print({} - {})

nenhum desses casos chama o metametodo newindex

Link para o comentário
Compartilhar em outros sites

eu pensei em checa as tableas dentro,mas problematico por tem que checa recursividade,se a de dentro ja tem metatable.

 

pensei em muda as funções de getpos e coloca pra já seta metatable,mas dai tem as pos que vem como arg de funções como onStepIn e tals,então acho que o melhor é o que o MaXwEllDeN uso(cria uma função pra seta a metatable),mas colocaria pra qualquer table,n só as de pos.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...