2012-05-14 13 views
5

Estoy trabajando con la aplicación de Codea para iPad y aprendiendo Lua. Codea usa Class.lua para las clases. Lo que intento lograr es una forma de especificar funciones para un método de obtención y configuración de variables. Actualmente, se puede acceder a una variable que dice "x" como esta: print (obj.x) y se establece con un código como este: obj.x = 1. Me gustaría que la variable llamara a una función get y set que pueda especificar . Estoy portando algo escrito en Actionscript 3 y necesito imitar las declaraciones de funciones get y set de A3. Avíseme si esto es posible o si es de otra manera. Puedo anular Class.lua de Codea si agregar o alterar su código es una solución. Gracias.Lua getters and setters

+0

http://nova-fusion.com/2011/04/04/implementing-proper- gettersetters-in-lua/que estaba a solo un google de distancia ... – PeterMmm

+0

He visto el enlace de arriba varias veces. También pensé que era la solución, pero no pude entender cómo iba a especificar las funciones de obtención y ajuste de una variable en particular. – Spencer

Respuesta

5

Puede crear un setter y getter personalizados anulando los métodos __newindex y __index en su clase.

Tenga en cuenta que tendrá que modificar LuaSandbox.lua, que es parte de Codea, para habilitar los métodos de rawset y rawget (comente las líneas definiéndolos en cero). EDITAR: Esto ya no es el caso en la última versión de Codea, rawset y rawget están disponibles de forma predeterminada.

Se llama al método __newindex cada vez que intenta establecer una propiedad en la tabla que no se haya establecido anteriormente.

Se llama al método __index cada vez que intenta obtener una propiedad que no existe en la tabla.

Para que pueda insertar un código personalizado para getters y setters creando una tabla privada en su clase y almacenando sus variables miembro allí. Cuando intenta leerlos y escribirlos, puede ejecutar código personalizado en sus métodos __newindex y __index.

MyClass = Class() 

function MyClass:init() 
    -- We'll store members in an internal table 
    self.members = {} 
end 

function MyClass:__newindex(index, value) 
    if index == "testMember" then 
     self.members[index] = value 
     print("Set member " .. index .. " to " .. value) 
    else 
     rawset(self, index, value) 
    end 
end 

function MyClass:__index(index) 
    if index == "testMember" then 
     print("Getting " .. index) 
     return self.members[index] 
    else 
     return rawget(self, index) 
    end 
end 

para probarlo

function setup() 
    foo = MyClass() 

    foo.testMember = 5 
    foo.testMember = 2 

    print(foo.testMember) 
end 

Usted puede encontrar más información sobre metamétodos aquí: http://lua-users.org/wiki/MetamethodsTutorial

Cuestiones relacionadas