Jump to content

Funciones con tablas


Recommended Posts

Bueno, hace tiempo entre @.:CiBeR.: y @venadHD estuvimos en un sitio web (que ahora no me acuerdo), editando un código del cual tenia varias dudas, y entonces me enseñaron un pequeño truco para hacer mis funciones más compactas, utilizando tablas. Hoy os traigo un pequeño ejemplo de elementData, pero se puede utilizar prácticamente con todo:

Es algo simple, pero viene bien para códigos largos y complejos:

data = { g = getElementData, s = setElementData, } 
  
addCommandHandler ( "setearnivel", 
    function ( player, commandName, cantidad ) 
        local cantidad = tonumber ( cantidad ) 
        local nivel = data.g ( player, "nivel" ) or 0 
        if cantidad then 
            data.s ( player, "nivel", nivel + cantidad ) 
            outputChatBox ( "¡Te has asignado "..cantidad.." de nivel!", player, 0, 255, 0 ) 
            outputChatBox ( "¡Nivel total: "..nivel.."!", player, 0, 255, 0 ) 
        else 
            outputChatBox ( "• Necesitas asignar una cantidad", player, 255, 255, 255 ) 
        end 
    end 
) 

Link to comment
  • Discord Moderators

Veo más simple y fácil utilizar el OOP (Object Oriented Programming, Programación Orientada a Objetos) que MTA: SA ofrece desde hace ya varias versiones.

Con solo añadir esto al meta.xml del recurso en el que lo que quieres usar OOP:

<oop>true</oop> 

Te evitas definir tablas, y trabajar con datos de un elemento es tan fácil como:

elemento:setData(nombre, dato) 
dato = elemento:getData(nombre) 

Además, hay planes de implementar la siguiente sintaxis, que es todavía más intuitiva:

elemento.data[nombre] = dato 
dato = elemento.data[nombre] 

Link to comment
Bueno, hace tiempo entre @.:CiBeR.: y @venadHD estuvimos en un sitio web (que ahora no me acuerdo), editando un código del cual tenia varias dudas, y entonces me enseñaron un pequeño truco para hacer mis funciones más compactas, utilizando tablas. Hoy os traigo un pequeño ejemplo de elementData, pero se puede utilizar prácticamente con todo:

Es algo simple, pero viene bien para códigos largos y complejos:

data = { g = getElementData, s = setElementData, } 
  
addCommandHandler ( "setearnivel", 
    function ( player, commandName, cantidad ) 
        local cantidad = tonumber ( cantidad ) 
        local nivel = data.g ( player, "nivel" ) or 0 
        if cantidad then 
            data.s ( player, "nivel", nivel + cantidad ) 
            outputChatBox ( "¡Te has asignado "..cantidad.." de nivel!", player, 0, 255, 0 ) 
            outputChatBox ( "¡Nivel total: "..nivel.."!", player, 0, 255, 0 ) 
        else 
            outputChatBox ( "• Necesitas asignar una cantidad", player, 255, 255, 255 ) 
        end 
    end 
) 

esa coma al final de la tabla loco, que sino da erró!

Link to comment
Bueno, hace tiempo entre @.:CiBeR.: y @venadHD estuvimos en un sitio web (que ahora no me acuerdo), editando un código del cual tenia varias dudas, y entonces me enseñaron un pequeño truco para hacer mis funciones más compactas, utilizando tablas. Hoy os traigo un pequeño ejemplo de elementData, pero se puede utilizar prácticamente con todo:

Es algo simple, pero viene bien para códigos largos y complejos:

data = { g = getElementData, s = setElementData, } 
  
addCommandHandler ( "setearnivel", 
    function ( player, commandName, cantidad ) 
        local cantidad = tonumber ( cantidad ) 
        local nivel = data.g ( player, "nivel" ) or 0 
        if cantidad then 
            data.s ( player, "nivel", nivel + cantidad ) 
            outputChatBox ( "¡Te has asignado "..cantidad.." de nivel!", player, 0, 255, 0 ) 
            outputChatBox ( "¡Nivel total: "..nivel.."!", player, 0, 255, 0 ) 
        else 
            outputChatBox ( "• Necesitas asignar una cantidad", player, 255, 255, 255 ) 
        end 
    end 
) 

esa coma al final de la tabla loco, que sino da erró!

No, no da.

Link to comment
  • MTA Team
Veo más simple y fácil utilizar el OOP (Object Oriented Programming, Programación Orientada a Objetos) que MTA: SA ofrece desde hace ya varias versiones.

Con solo añadir esto al meta.xml del recurso en el que lo que quieres usar OOP:

<oop>true</oop> 

Te evitas definir tablas, y trabajar con datos de un elemento es tan fácil como:

elemento:setData(nombre, dato) 
dato = elemento:getData(nombre) 

Además, hay planes de implementar la siguiente sintaxis, que es todavía más intuitiva:

elemento.data[nombre] = dato 
dato = elemento.data[nombre] 

Nunca nada será mas facil que usar algo que vos mismo creaste. Por ejemplo crear una tabla que se llame funciones y asignarle valores como sD( set data ), sAD( set account data ) y demas. Obviamente utilizar lo que ya viene por defecto puede probar ser mas eficiente, pero en general nunca es mas comodo que algo creado por nosotros mismos.

funciones = {  
gD = getElementData,  
sD = setElementData, 
sAD = setAccountData 
} 
-- Luego es tan solo 
  
funciones.gD() 
funciones.sD() 
funciones.sAD() 

Yo incluso utilizo nombres que me recuerdan a cosas de la vida cotidiana, asi las memorizo mas facilmente :P

Link to comment
  • Discord Moderators

Depende de los gustos. Alguien puede estar de acuerdo en que llamar a unas funciones con un nombre diferente puede ser más fácil e intutivo que referirse a ellas por su propio nombre, bien sea porque es un ingenio propio, bien porque puede llegar a entorpecer el robo de scripts o bien por cualquier otro argumento. Sin embargo, también es posible encontrarse con alguien que piense que darle un nombre no estándar a una función es una pérdida de tiempo, por tener que mirar una tabla para entender el código; que piense que ni siquiera aporta una sintaxis más clara, por seguir siendo no orientado a objetos; y que piense que dar nombres abreviados solo tienen sentido en un contexto reducido y son equívocos (por ejemplo, "sAD" en un script de aviones podría referirse a una función del script llamada setAirplaneData, no a setAccountData).

Personalmente, como creo que di a entender ya, prefiero llamar a las funciones de una manera normal porque todos los que hacen scripts la conocen, y eso hace que el código sea más fácil de mantener si el concepto de sentido común del autor cambia o varias personas trabajan en él. Aunque también tiene sentido que uno mismo quiera trabajar cómodo, ahorrando caracteres que teclear o copiar, y tampoco soy nadie para impedírselo. Al fin y al cabo, en la tecnología importa más la solución que los pasos intermedios :wink:

Link to comment

La verdad es que a mi este pequeño truco me ha ayudado mucho en códigos largos y complejos que he realizado y viene bastante bien. El problema del oop es que cambian ligeramente las funciones, como:

Method: element:getData(...)  

Lo cual a mi pues puede llegar a liarme si el código es largo. En cambio al usar una pequeña tabla con sus funciones pues no me lío, sé lo que he puesto y a que se refiere. Pero bueno, cada uno es libre de scriptear a su manera, es simplemente un pequeño "truco" que me mostraron y quise compartir :)

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...