2012-05-14 20 views
5

मैं कोडा आईपैड ऐप के साथ काम कर रहा हूं और लुआ सीख रहा हूं। कोडा कक्षाओं के लिए Class.lua का उपयोग करता है। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह एक चर के लिए कार्यों को निर्दिष्ट करने और विधियों को सेट करने का एक तरीका है। वर्तमान में, एक वैरिएबल का कहना है कि "एक्स" को एक्सेस किया जा सकता है: प्रिंट (obj.x) और इस तरह के कोड के साथ सेट करें: obj.x = 1. मैं वैरिएबल के लिए एक गेट और सेट फ़ंक्शन को कॉल करना चाहता हूं जिसे मैं निर्दिष्ट कर सकता हूं । मैं एक्शनस्क्रिप्ट 3 में लिखे गए कुछ को पोर्ट कर रहा हूं और ए 3 की नकल करने और फ़ंक्शन घोषणाओं को सेट करने की आवश्यकता है। अगर यह संभव है या अगर उनका दूसरा तरीका है तो मुझे बताएं। मैं कोडेरा क्लास को ओवरराइड कर सकता हूं। अगर इसका कोड जोड़ना या बदलना एक समाधान है। धन्यवाद।लुआ गेटर्स और सेटर्स

+0

http://nova-fusion.com/2011/04/04/implementing-proper- gettersetters-in-lua/वह केवल एक google दूर था ... – PeterMmm

+0

मैंने उपरोक्त लिंक को कई बार देखा है। मैंने यह भी सोचा कि यह समाधान था, लेकिन मैं यह नहीं समझ पाया कि मैं एक विशेष चर के कार्यों को प्राप्त करने और सेट करने के तरीके को कैसे निर्दिष्ट करूंगा। – Spencer

उत्तर

5

आप अपनी कक्षा में __newindex और __index विधियों को ओवरराइड करके कस्टम सेटर और गेटटर बना सकते हैं।

ध्यान दें कि आपको कोडा का हिस्सा है, जो कोडा का हिस्सा है, कच्चेसेट और कच्चे तरीके को सक्षम करने के लिए (उन्हें लाइनों को नील करने के लिए लाइनों पर टिप्पणी करें) को संशोधित करना होगा। संपादित करें: यह अब कोडा के नवीनतम संस्करण, rawset और rawget डिफ़ॉल्ट रूप से उपलब्ध नहीं है।

जब भी आप उस तालिका पर कोई संपत्ति सेट करने का प्रयास करते हैं तो __newindex विधि को कॉल किया जाता है जो पहले सेट नहीं किया गया था।

जब भी आप ऐसी संपत्ति प्राप्त करने का प्रयास करते हैं तो __index विधि को कॉल किया जाता है जो तालिका में मौजूद नहीं है।

तो आप अपनी कक्षा में एक निजी टेबल बनाकर और अपने सदस्य चर को संग्रहीत करके गेटर्स और सेटर्स के लिए कस्टम कोड डाल सकते हैं। जब आप उन्हें पढ़ने और लिखने का प्रयास करते हैं, तो आप अपने __newindex और __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 

यह

function setup() 
    foo = MyClass() 

    foo.testMember = 5 
    foo.testMember = 2 

    print(foo.testMember) 
end 

आप यहाँ metamethods बारे में अधिक जानकारी प्राप्त कर सकते हैं परीक्षण करने के लिए: http://lua-users.org/wiki/MetamethodsTutorial

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^