2013-10-31 20 views
6

Ich habe ein paar Werte in C, die ich von Lua aktualisieren möchte und ich habe meine eigenen Bindungsfunktionen geschrieben, aber ich möchte wissen, ob etwas möglich ist.Einstellung C Eigenschaften von Lua

Ich möchte diese

myNamespace.myValue = 10 

tun zu können und haben es als dieser

myNamespace.setMyValue(10) 

möglich, die gleiche Sache zu tun? Hauptsächlich neugierig. Es ist einfach sauberer, einen Wert direkt zuzuweisen/zu lesen, anstatt eine Get/Set-Funktion aufzurufen. Kann Lua irgendeine automatische Übersetzung machen?

Antwort

7

Dies ist sicherlich möglich. Sie können das Metamethod __newindex überladen, um myValue in setMyValue zu übersetzen und dann das auf dem Tisch aufrufen. Ein Beispiel:

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" 

Dies wird "Wert auf Hallo setzen" drucken.

Sie könnten __index überladen, um dasselbe zu tun, aber auch mit getMyValue.

+2

Dies ist per OP-Anfrage. Warum er für jede Variable Setter schreiben möchte, anstatt die '__newindex' Methode direkt zu benutzen, weiß ich nicht. – lhf

+2

Beachten Sie, dass 'setMyValue' nicht in' myNamespace.myValue' schreiben sollte, sondern in eine private Tabelle. Das '__index' Metamethode sollte aus dieser Tabelle lesen. – lhf

+0

Super! Ich dachte, das wäre eine totale Chance. Lua wird jeden Tag kühler, danke. –