आम तौर पर कक्षा के अंत में __PACKAGE__->meta->make_immutable
के माध्यम से संकलन में एक वर्ग को अंतिम रूप दिया जाएगा। हालांकि, मुझे कक्षा को अपरिवर्तनीय बनाने के लिए कब किया जाना चाहिए जो रनटाइम पर खुद को भूमिकाएं बनाते हैं? क्या मुझे बेहतर प्रदर्शन करने के लिए भी ऐसा करना चाहिए या यह make_immutable
के साथ असंगत है? make_immutable
ऑब्जेक्ट की तात्कालिकता को तेज करने लगता है, लेकिन ऑब्जेक्ट को तुरंत चालू करने के बाद यह कुछ भी करता है?जब मैं वास्तव में उपयोग कर रहा हूं -> मेटा जब मैं मूस क्लास को अपरिवर्तनीय बनाऊं?
, की तर्ज पर कुछ:
BUILD {
my $self = shift;
use Module::Load;
### Use the arguments passed in to determine roles applicable to
### this instance of the object. Load and apply roles.
for my $role ($self->_determine_roles()) {
load $role;
$role->meta->apply($self);
}
### $self is now a Class::MOP::Class::__ANON__... anonymous class
### Should I then be saying I'm done mutating it with something like this?
### can make_immutable even be run on an object instance and not a package?
$self->meta->make_immutable;
}
यहां तक कि अगर कोड ऊपर एक भी पैकेज के लिए काम करता है, क्या होता है जब एक वस्तु 'Foo'
भूमिका के साथ ही reblesses, एक गुमनाम वर्ग में जिसके परिणामस्वरूप तो, एक दूसरी वस्तु 'Foo'
(उसी एनन कक्षा बनने) के साथ खुद को आशीर्वाद देती है तो 'Bar'
भूमिका? क्या यह सही ढंग से काम करने जा रहा है जब दूसरी वस्तु खुद को अपरिवर्तनीय पहले अज्ञात वर्ग में आशीर्वाद देती है, तो अब एक नई अज्ञात कक्षा बनाने के लिए अब अपरिवर्तनीय अनाम कक्षा में भूमिका निभाने का प्रयास करती है?
Moose::Meta::Class पर दस्तावेज़ पढ़ने से, ऐसा लगता है कि केवल एक वर्ग अपरिवर्तनीय हो सकता है, वस्तुओं के उदाहरण नहीं। यदि हां, तो क्या मुझे make_immutable
को अनदेखा करना चाहिए क्योंकि मैं अपनी कक्षाओं को बदल रहा हूं?
और जब भी मैं नई अज्ञात कक्षा को अपरिवर्तनीय रूप से सेट करता हूं, तब भी यह एक और अज्ञात वर्ग बना रहा है जो पहले अपरिवर्तनीय एनन वर्ग और नई अपरिवर्तनीय भूमिका दोनों को समाहित करता है, इसलिए अपरिवर्तनीय अनाम कक्षा में भूमिका निभाने के लिए अभी भी ठीक से काम करेगा। समझ गया! – Oesor