2013-10-31 18 views
6

Ho alcuni valori in C che vorrei aggiornare da Lua e ho scritto le mie funzioni di binding, ma voglio sapere se qualcosa è possibile.Impostazione delle proprietà C da Lua

voglio essere in grado di fare questo

myNamespace.myValue = 10 

e farlo fare la stessa cosa in quanto questo

myNamespace.setMyValue(10) 

possibile? Per lo più curioso. È solo più pulito assegnare/leggere direttamente un valore invece di chiamare una funzione get/set. Lua può fare qualsiasi auto-traduzione come quella?

risposta

7

Questo è certamente possibile. È possibile sovraccaricare il metametodo __newindex per tradurre myValue su setMyValue e quindi chiamarlo sulla tabella. Un esempio:

local meta = { 
    __newindex = function(t, key, value) 
     local setterName = "set" .. key:sub(0, 1):upper() .. key:sub(2) 
     local setter = t[setterName] 
     if setter == nil then 
      error("Setter " .. setterName .. " does not exist on table") 
     end 

     return setter(t, value) 
    end 
} 

local table = { 
    setMyValue = function(self, v) 
     print("Set value to " .. tostring(v)) 
    end 
} 
setmetatable(table, meta) 

table.myValue = "Hello" 

Questo stamperà "Imposta valore su Ciao".

Si potrebbe voler sovraccaricare __index per fare lo stesso, ma con getMyValue pure.

+2

Questo è per la richiesta OP. Perché vorrebbe scrivere setter per ogni variabile invece di usare il metodo '__newindex' direttamente non lo so. – lhf

+2

Nota che per far funzionare tutto ciò, 'setMyValue' non dovrebbe scrivere in' myNamespace.myValue', ma su una tabella privata. Il metametodo '__index' dovrebbe leggere da quella tabella. – lhf

+0

Fantastico! Pensavo che fosse un colpo lungo. Lua si raffredda ogni giorno, grazie. –

Problemi correlati