2009-01-23 10 views
51

क्या पर्ल के पास एक गणना प्रकार है जो सर्वोत्तम प्रथाओं का पालन करता है, या शायद अधिक महत्वपूर्ण बात, क्या इसकी आवश्यकता है?क्या पर्ल के पास गणना का प्रकार है?

जिस परियोजना में मैं काम कर रहा हूं, वह ऐसी चीजों को दर्शाने के लिए सभी जगहों पर तारों का उपयोग करता है जो आम तौर पर सी # जैसी भाषा में एनम का उपयोग करते हैं।

$phone_number->{type} = 'Home'; 

यह पर्याप्त नहीं होगा: उदाहरण के लिए, हम एक हैश की एक सरणी, एक फोन प्रकार से संबद्ध प्रत्येक में ("घर", "काम", "मोबाइल" आदि) फ़ोन नंबरों का सेट है यहां चर के केवल पढ़ने के सेट का उपयोग करने के लिए या एनम का उपयोग किया जाना चाहिए? मुझे enum module on CPAN मिला है लेकिन ऐसा लगता है कि यह नंगे शब्दों का उपयोग करता है जो Perl Best Practices में से एक का उल्लंघन करता है।

use Readonly; 

Readonly my $HOME => 'Home'; 
Readonly my $WORK => 'Work'; 
Readonly my $MOBILE => 'Mobile'; 

$phone_number->{type} = $HOME; 

यह एक अच्छा दृष्टिकोण है या एक बेहतर तरीका है: read-only variables के प्रयोग पर मेरी सोच कुछ इस तरह चला जाता है?

उत्तर

39

नहीं, कोई अंतर्निर्मित enum निर्माण नहीं है। पर्ल बहुत सख्त टाइपिंग नहीं करता है, इसलिए मुझे लगता है कि वास्तव में एक की आवश्यकता नहीं है।

मेरी राय में, Readonly आपके द्वारा उपयोग किए जाने वाले दृष्टिकोण ठोस हैं।

और पारंपरिक प्रगामा भी है।

use constant { 
    HOME => 'Home', 
    WORK => 'Work', 
    MOBILE => 'Mobile', 
}; 

$phone_number->{type} = HOME; 

दृश्यों के पीछे, यह प्रत्येक स्थिरता के लिए एक फ़ंक्शन सेट करता है जो इस तरह मान देता है।

sub HOME() { 'Home' } 

मैं Readonly साथ रहना चाहते हैं जब तक आप उस संपत्ति का लाभ लेना चाहते हैं, उदाहरण के लिए:

package Phone::Type; 

use constant { 
    HOME => 'Home', 
    #... 
}; 

package main; 

print Phone::Type->HOME, "\n"; 
+0

सख्तता के लिए, उप घर() {'home'} दृश्य के पीछे बनाया गया है। –

+0

जब आपके पास कोई सबराउटिन होता है जो फ़ोन :: टाइप एनम को तर्क के रूप में लेता है, तो आप subroutine तर्क पर गतिशील जांच कैसे करते हैं फ़ोन :: प्रकार प्रकार enum, स्ट्रिंग नहीं, संख्या नहीं है ... –

+0

बस स्पष्टीकरण उप HOME के ​​लिए () {'home'} और निरंतर { HOME => 'होम', वर्क => 'वर्क', मोबाइल => 'मोबाइल', }; वही हैं? बाद में उत्पन्न होता है (दृश्य के पीछे) कोड? –

10

पर्ल अवधारणा मूल रूप से समर्थन नहीं करता है लेकिन इस कार्यक्षमता

https://metacpan.org/pod/enum

8

आपका तरीका पर्याप्त से अधिक है जोड़ने के लिए मॉड्यूल हैं।

यदि आप मूस का उपयोग करते हैं, तो आप मूस :: Util :: TypeConstraints के साथ भी enums बना सकते हैं। (जो आपको होना चाहिए।)

17

पर्ल वास्तव में है एक enum प्रकार सी में की तरह जानकारी के लिए इस की कोशिश करो।

perldoc enum

उदाहरण के लिए:

use enum qw(HOME WORK MOBILE); 

अब हमारे पास:

HOME == 0 
WORK == 1 
MOBILE == 2 

तुम भी indeces सेट कर सकते हैं अपने आप को:

use enum qw(HOME=0 WORK MOBILE=10 FAX); 

अब हमारे पास:

HOME == 0 
WORK == 1 
MOBILE == 10 
FAX == 11 

अधिक जानकारी के लिए here देखें।

ध्यान दें कि यह पर्ल के प्रत्येक संस्करण में समर्थित नहीं है। मुझे पता है कि v5.8.3 इसका समर्थन नहीं करता है, जबकि v5.8.7 करता है।

+8

जैसा कि मैं बता सकता हूं, 'एनम का उपयोग करें' एक सीपीएएन मॉड्यूल है, जो मुख्य भाषा का हिस्सा नहीं है। –

+0

@ पॉल नाथन ... मुझे यकीन नहीं है कि इसे किसी को इसका उपयोग करने से रोकना चाहिए। बड़ी संख्या में पर्ल विशेषताएं कोर का हिस्सा नहीं हैं। –

+0

अन्य सभी तकनीकें मेरे लिए दर्द थीं। मेरे पास चर का एक टन था, और प्रत्येक अनुक्रमिक लेबल करना था। फिर - मेरे बाहरी ऐप ने अपना प्रारूप बदल दिया, सूची की शुरुआत में एक परिभाषा को जोड़ा जाना आवश्यक था - इस प्रकार मुझे सब कुछ छोड़ना पड़ा! enum मॉड्यूल निश्चित रूप से जाने का रास्ता था !! – Brad

2

आपको हमेशा याद रखना चाहिए कि पीबीपी सलाहकार है - पुस्तक उतनी ही अधिक है। आपको उन्हें अपनाने के बजाय दिशानिर्देशों की व्याख्या करने की आवश्यकता है।

+0

डाउनवॉटेड क्योंकि, जबकि यह सच है, यह भी –

+2

विषय से बाहर है, मेरी टिप्पणी का जवाब: मैं गलत हूं, यह उत्तर पूरी तरह से विषय से बाहर नहीं है; यह सिर्फ स्पष्ट रूप से स्पष्ट बता रहा है। एक बेहतर/अधिक उपयोगी उत्तर barewords के पेशेवरों और विपक्षों पर चर्चा करेगा और एनम मॉड्यूल का उपयोग क्यों करना चाहिए या नहीं। –

+0

यह विषय/ऑफ विषय का विषय नहीं है। यह एक टिप्पणी है, उत्तर नहीं, इसलिए – ysth

5

मैं डर पर्ल पूरी तरह से व्यक्ति को पक्षाघात जब यह इन enums और नाम स्थिरांक की बात आती है:

  • enum और केवल पढ़ने के लिए कोर मॉड्यूल (कम से कम पर्ल 5.8 पर है, जो मैं अभी जाँच की) नहीं हैं। इसलिए ये ऐसी प्रणाली पर अनुपलब्ध हो सकते हैं जहां नए मॉड्यूल स्थापित करने की कोई स्वतंत्रता नहीं है।

  • "निरंतर उपयोग" "सख्त का उपयोग" (जो हमेशा का उपयोग करना चाहिए) के साथ, पूरी तरह से बेकार है, क्योंकि यह फार्म की भयानक त्रुटि संदेशों में से एक लोड उत्पन्न करता है:

    Bareword "फ्रेड" की अनुमति नहीं है, जबकि " सख्त बाद के चरणों "उपयोग

आइए आशा में वे, पर्ल 6 में इस गंदगी हल करता है, तो यह है कि कभी दिन का प्रकाश में देखता है!

+1

के रूप में दर्ज किया जाना चाहिए था कॉन्स्टेंट चेतावनियां मुद्रित नहीं करते हैं, और 5.8 में नहीं थे: 'perl -e' सख्त qw (subs) का उपयोग करें; निरंतर FRED => q {fred} का उपयोग करें; printf qq {पर्ल% vd \ n कॉन्स्टेंट% s \ n} है, $^वी, FRED'' 'पर्ल 5.8.4 कॉन्स्टेंट फ्रेड है और कोई चेतावनी नहीं देता है। (हाँ, मुझे एहसास है कि यह जवाब कई साल पुराना है ...) – derobert

0

यह मेरे लिए अच्छी तरह से काम किया ...

use constant MYENUM => qw(ZERO ONE TWO THREE FOUR); 

BEGIN { 
    eval "use constant (MYENUM)[$_] => $_;" foreach 0..(MYENUM)-1; 
} 

फिर आप स्थिरांक के रूप में ZERO, ONE, TWO आदि का उपयोग करें और (MYENUM)[$value] का उपयोग कर बाहर उनकी प्रतीकात्मक नाम मुद्रित कर सकते हैं।

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