2011-11-10 7 views
8

मैं मैटलैब वर्गों और उनकी संपत्तियों के बारे में कुछ और समझने की कोशिश कर रहा हूं। यहाँ एक परीक्षण वर्ग मैं बनाया है है:गुण विधि वर्ग से नए मूल्य पर क्यों नहीं लेते हैं?

classdef Test  
    properties 
     % Properties of the network type 
     some_var 
    end 

    methods 
     function N = Test() 
     end 

     function change_var(N, val) 
      N.some_var=val; 
     end 
    end 
end 

अब, मैं इस वर्ग का एक उदाहरण "change_var()" बनाते हैं, और कहते हैं ...

>> a=Test; 
>> a.change_var(2); 
>> a.some_var 

ans = 

    [] 

क्यों संपत्ति "some_var" है असाइनमेंट में मूल्य "वैल" पर नहीं लिया गया?

+0

देखें: इसके बाद, आप के रूप में परिवर्तन के साथ a अपडेट करना होगा [matlab कक्षाएं: संभाल या मूल्य] (http://stackoverflow.com/questions/6436539/matlab-classes-handle-or- मूल्य) हैंडल बनाम मूल्य वर्गों की चर्चा के लिए। –

उत्तर

11

Test कक्षा को value-class as opposed to a handle class के रूप में परिभाषित किया गया है। प्रभावी रूप से, जब आप a.change_var पर कॉल करते हैं, a बाय-वैल्यू में पास किया जाता है। some_var संपत्ति के लिए परिवर्तन स्टोर करने के लिए ऐसा करते हैं:

 
>> a = Test; 
>> a = a.change_var(2); 

विकल्प Test एक हैंडल वर्ग जो मामले में अपने प्रश्न में उदाहरण के लिए काम करेंगे के रूप में आप की उम्मीद करना है। ऐसा करने के लिए, यह करने के लिए अपनी कक्षा परिभाषा की पहली पंक्ति को बदलने के द्वारा handle वर्ग से विरासत:

 
classdef Test < handle 
+0

बिंगो! जो पूरी तरह से काम करता है, बहुत बहुत धन्यवाद :) मुझे जवाब के रूप में इसे चुनने के लिए 4 मिनट का इंतजार करना है, लेकिन – gnychis

+4

करेगा यह उल्लेख करना महत्वपूर्ण है कि कक्षा बनने के बाद ** ** होल्ड करें, वे चर जो इस वर्ग को बनने के लिए असाइन किया गया था स्मृति में एक ही वस्तु का संदर्भ। उन चरों में से किसी एक में संपत्ति को बदलने से उदाहरण के लिए सी # में ऑब्जेक्ट संदर्भ के समान गुणों में संपत्ति मूल्य बदल जाएगा। – Celdor

3

विधि एक तरह से संपत्ति को बदलने के लिए के लिए प्रदान करता है, लेकिन आप यह भी ऑब्जेक्ट प्रदान। आपको अपनी विधि को संशोधित करने की आवश्यकता होगी:

function N = change_var(N, val) 
    N.some_var=val; 
end 

ध्यान दें कि फ़ंक्शन संशोधित ऑब्जेक्ट देता है।

a = a.change_var(2); 
+2

स्पष्ट होने के लिए: यहां दिखाया गया उदाहरण एक मान ऑब्जेक्ट क्लास (यानी: एक हैंडल ऑब्जेक्ट नहीं) के लिए है, और यह मूल ऑब्जेक्ट की संपत्ति को प्रतिस्थापित नहीं करता है। फ़ंक्शन को एन तर्क में मूल ऑब्जेक्ट का _copy_ प्राप्त होता है, उस ऑब्जेक्ट की some_var प्रॉपर्टी को संशोधित करता है, और ऑब्जेक्ट की संशोधित प्रति लौटाता है। – gwideman

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