मैं वर्तमान में केवल पढ़ने के लिए एक विशेषता सेट करने के लिए एक ब्लॉक eval
का उपयोग करता हूं। क्या ऐसा करने का कोई आसान तरीका है?क्या मूस विशेषता केवल पढ़ने के लिए परीक्षण करने का एक आसान तरीका है?
उदाहरण:
#Test that sample_for is ready only
eval { $snp_obj->sample_for('t/sample_manifest2.txt');};
like([email protected], qr/read-only/xms, "'sample_for' is read-only");
अद्यतन
धन्यवाद friedo को, ईथर, और रॉबर्ट पी उनके जवाब के लिए और ईथर, रॉबर्ट पी करने के लिए, और उनकी टिप्पणियों के लिए jrockway।
मुझे पसंद है कैसे ईथर के जवाब सुनिश्चित करता है कि $is_read_only
केवल एक सही या गलत मूल्य (अर्थात लेकिन कभी एक coderef) एक !
के साथ negating कर रहा है। Double negation यह भी प्रदान करता है। इस प्रकार, आप का उपयोग is()
फ़ंक्शन में कर सकते हैं, बिना कोडफ़्रफ़ को प्रिंट किए।
सबसे पूर्ण उत्तर के लिए रॉबर्ट पी का उत्तर नीचे देखें। हर कोई एक दूसरे के जवाब और टिप्पणियों पर बहुत मददगार और बनाया गया है। कुल मिलाकर, मुझे लगता है कि उसने मुझे सबसे ज्यादा मदद की है, इसलिए अब उसे स्वीकार किए गए उत्तर को चिह्नित किया गया है। फिर, ईथर, रॉबर्ट पी, फ्रेडेडो, और जॉकॉक के लिए धन्यवाद।
मामले में आप, सोच रहा हो सकता है के रूप में मैं पहली बार में किया था, यहाँ get_attribute
और find_attribute_by_name
(from Class::MOP::Class) के बीच अंतर के बारे में दस्तावेज़ है:
$metaclass->get_attribute($attribute_name)
This will return a Class::MOP::Attribute for the specified $attribute_name. If the
class does not have the specified attribute, it returns undef.
NOTE that get_attribute does not search superclasses, for that you need to use
find_attribute_by_name.
कि बेहतर 'ठीक रूप में लिखा जाएगा ($ snp_obj -> मेटा-> get_attribute ('sample_for') -> get_write_method(), "'sample_for' केवल पढ़ने के लिए है"); '- परीक्षण विफलता पर, 'है()' दूसरे तर्क को मुद्रित करता है (जो एक coderef होगा) .. उल्लेख नहीं है कि आपके पास पहला और दूसरा तर्क उलट है: 'है ($ है, $ अपेक्षित, $ test_name)'। – Ether
यदि आपकी @attribute_names सरणी सावधानी से बनाई गई है, तो आपको ठीक होना चाहिए; लेकिन यदि विशेषता मौजूद नहीं है तो आप विस्फोट करेंगे :) –
+1 सुपरक्लास – user1027562