2012-05-14 20 views
5

Codea iPad uygulamasıyla çalışıyorum ve Lua'yı öğreniyorum. Codea, sınıflar için Class.lua kullanır. Elde etmeye çalıştığım şey, bir değişken için alma ve ayarlama yöntemleri için işlevler belirtmenin bir yoludur. Şu anda, bir değişkenin "x" ye erişilebildiğini söyleyebiliriz: print (obj.x) ve bunun gibi bir kodla set: obj.x = 1. Bunun yerine değişken için bir get ve set fonksiyonunu çağırmak istiyorum . Actionscript 3'te yazılmış bir şeyi tasvir ediyorum ve A3'in getiri ve işlev bildirimlerini ayarlaması gerekiyor. Mümkünse veya başka bir yolu varsa bana bildirin. Kodunun eklenmesi veya değiştirilmesi bir çözüm ise Codea'nın Class.lua'sını geçersiz kılabilirim. Teşekkürler.Lua alıcıları ve ayarlayıcıları

+0

http://nova-fusion.com/2011/04/04/implementing-proper- gettersetters-in-lua/bu sadece bir google uzakta oldu ... – PeterMmm

+0

Ben birkaç kez yukarıdaki bağlantıya baktım. Ayrıca, çözüm olduğunu düşündüm, ama belirli bir değişkenin get ve set fonksiyonlarını nasıl belirleyeceğimi anlayamadım. – Spencer

cevap

5

Sınıfınızdaki __newindex ve __index yöntemlerini geçersiz kılarak özel bir ayarlayıcı ve getter oluşturabilirsiniz.

Rawset ve rawget yöntemlerini etkinleştirmek için Codea'nın bir parçası olan LuaSandbox.lua'yı değiştirmeniz gerekeceğini unutmayın (bunları sıfırlayan satırları yorumlayın). DÜZENLEME: Bu, Codea'nın en son sürümünde artık geçerli değil, rawset ve rawget varsayılan olarak kullanılabilir.

__newindex yöntemi, daha önce ayarlanmamış bir tabloya bir özellik belirlemeyi denediğinizde çağrılır.

Tabloda bulunmayan bir özelliği almaya çalıştığınızda, __index yöntemi çağrılır.

Böylece, sınıfınızda özel bir tablo oluşturarak ve üye değişkenlerinizi orada saklayarak, alıcılar ve ayarlayıcılar için özel kod ekleyebilirsiniz. Onları okumaya ve yazmaya çalıştığınızda, __newindex ve __index yöntemlerinde özel kod çalıştırabilirsiniz.

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 

o

function setup() 
    foo = MyClass() 

    foo.testMember = 5 
    foo.testMember = 2 

    print(foo.testMember) 
end 

Burada metamethods hakkında daha fazla bilgi bulabilirsiniz test etmek için: http://lua-users.org/wiki/MetamethodsTutorial