2013-08-21 7 views
5

पर्ल में, यह एक hashref आशीर्वाद और स्टोर और संपत्तियों को पढ़ने के लिए इसका उपयोग करना आसान है:स्केलर आधारित पर्ल क्लास पर गुणों को कैसे संभालें?

package MyPackage; 
use strict; 
use warnings; 

sub new { 
    bless {}, __PACKAGE__; 
} 

sub SomeProperty { 
    my $self = shift; 
    if (@_) { 
     return $self->{SomeProperty} = shift; 
    } 
    $self->{SomeProperty}; 
} 

# Or even like this to be able to call $obj->OtherProperty = $x; 

sub OtherProperty : lvalue { 
    my $self = shift; 
    $self->{OtherProperty}; 
} 

लेकिन, मैं कुछ वर्ग (विभिन्न पर्ल मॉड्यूल से) देखा है कि, जब फेंक दिया, एक सरल अदिश दिखाने धन्य:

$obj = bless(\$8756489, 'Some::Package'); 

फिर भी, उनके पास विधियां और गुण हैं। विधियों को मैं समझता हूं, किसी भी subroutine पैकेज can कॉल तब आशीर्वाद दिया जाएगा जब एक धन्य $object->name पूछेगा। जिस हिस्से को मैं समझ नहीं पा रहा हूं वह यह है कि वे गुणों को कैसे स्टोर कर सकते हैं। उन गुणों को कहां रखा जा रहा है?

कई बार वे $obj->property = $x या $obj->property($x) जैसी चीजें स्वीकार करते हैं और उसी कक्षा के अन्य उदाहरणों से स्वतंत्र हो सकते हैं। उन गुणों को कहां रखा जा रहा है?

मुझे पता है कि वास्तव में कक्षा के अंतर्निहित कार्यान्वयन पर निर्भर करता है, यह क्या कर रहा है या यह किसके साथ बातचीत कर रहा है, और वास्तव में कई बार सवाल का जवाब दे सकता है (उदाहरण के लिए ऑब्जेक्ट सिर्फ किसी अन्य ऑब्जेक्ट या कनेक्शन के साथ इंटरफेसिंग कर रहा है और केवल मूल्यों को भेजना या उद्धरण देना)।

हालांकि, यदि गुणों को स्टोर करने के लिए स्केलर आधारित ऑब्जेक्ट का एक तरीका है (जैसे पर्ल में कक्षा संरचना के लिए एक अलग अवधारणा या दृष्टिकोण में), तो मैं वास्तव में इसे जानना चाहता हूं।

किसी भी टिप्पणी के लिए अग्रिम धन्यवाद! :-)

+0

क्या आप ऐसे किसी भी मॉड्यूल के उदाहरण दे सकते हैं? – Borodin

+0

मैं वास्तव में ट्रैक नहीं रखता, यह केवल कुछ ऐसा है जिसने मुझे हर बार इसे और अधिक जिज्ञासा बना दिया है, जो वास्तव में केवल उन समय है जहां मैं वास्तव में कुछ मूल्य देखने के लिए किसी ऑब्जेक्ट को डंप करने का प्रयास करता हूं। एक उदाहरण जो मेरे दिमाग में आता है वह अभी जीडी है। एक 'नई जीडी :: छवि' बनाएं और फिर इसे डंप करें। –

+0

जीडी :: छवि एक एक्सएस-आधारित वर्ग का एक उदाहरण होगा, क्योंकि यह एक पर्ल बाध्यकारी है [libgd] (http://www.libgd.org/)। – cjm

उत्तर

8

ठीक है, एक तरीका inside-out objects का उपयोग करना है। दूसरा एक एक्सएस-आधारित वर्ग का उपयोग करना है, जहां स्केलर सी/सी ++ संरचना का पता संग्रहीत करता है जिसमें गुण संग्रहीत होते हैं (यह आमतौर पर तब किया जाता है जब वर्ग का उद्देश्य सी/सी ++ लाइब्रेरी के साथ इंटरफ़ेस करना होता है)।

आप substr या pack का उपयोग कर स्केलर के इंडेक्स भागों की तरह अजीब कुछ भी कर सकते हैं, लेकिन मुझे संदेह है कि किसी को भी यह साबित करने के अलावा कि यह किया जा सकता है।

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