2010-11-13 11 views
12

पर्ल में, आप इस तरह एक पाश है, तो:पर्ल में, क्या फ़ोरैच लूप के बजाय शून्य संदर्भ में मानचित्र का उपयोग करना उचित है?

foreach (@items) { 
    perform_action($_); 
} 

आप शून्य संदर्भ में map के लिए एक कॉल के साथ बदलना कर सकते हैं:

map { 
    perform_action($_) 
} @items; 

वहाँ करने के लिए कर रही है के लिए किसी भी लाभ या नुकसान कर रहे हैं? क्या इसका प्रदर्शन प्रभाव पड़ता है क्योंकि पर्ल सोचता है कि इसे परिणामों को सहेजना है? क्या यह पठनीयता में सुधार/खराब है?

उत्तर

17

शून्य संदर्भ में पर्ल 5.8.1 नक्शे से शुरू महंगा नहीं है: शून्य संदर्भ में

नक्शा नहीं रह गया है महंगा है। नक्शा अब संदर्भ जागरूक है, और शून्य संदर्भ में बुलाए जाने पर एक सूची नहीं बनाएगा।

लेकिन for की पोस्टफ़िक्स प्रपत्र अधिक पठनीय हो सकता है:

perform_action($_) for @items; 
+11

जबकि मानचित्र विवरण स्वयं इसके संदर्भ से अवगत हो सकता है, प्रोग्रामर शायद नहीं। 'Sub foo {map {...} @_} जैसी संरचनाओं से 'यह कहना आसान नहीं है कि वास्तव में क्या होगा और यदि आप अपने कार्यान्वयन के कुछ हिस्सों को लीक कर रहे हैं, तो आप जो करना चाहते थे वह मानचित्र के रूप में दुरुपयोग करना था के लिए नियमित – rafl

+2

perldoc यह भी कहता है कि फ़ोरैच लूप स्पष्ट है तो नक्शा: "ध्यान दें कि $ _ सूची मूल्य के लिए उपनाम है, इसलिए इसका उपयोग LIST के तत्वों को संशोधित करने के लिए किया जा सकता है। हालांकि यह उपयोगी और समर्थित है, यह विचित्र परिणाम दे सकता है यदि सूची के तत्व चर नहीं हैं। इस उद्देश्य के लिए एक नियमित foreach पाश का उपयोग ज्यादातर मामलों में स्पष्ट होगा। " – jira

4

मेरा मानना ​​है कि 'पर्ल बेस्ट प्रैक्टिस' foreach लूप में एक स्पष्ट चर का उपयोग करने की सिफारिश करेगा, यह निश्चित रूप से है कि मैं इसका उपयोग करूंगा।

foreach my $item (@items) 
{ 
    perform_action($item); 
} 

यह map (या grep) का दुरुपयोग एक शून्य संदर्भ में इसका इस्तेमाल करने की है।

+0

मैं "दुरुपयोग" से "गलतफहमी" मोरेसो कह सकता हूं, लेकिन हाँ: 'मेरे $ आइटम (@items) {act ($ item)} के लिए' तुलना करने के लिए इतना बेहतर है। – tchrist

14

समस्या शून्य संदर्भ में map या grep उपयोग करने के साथ मुख्य रूप से वैचारिक है। दोनों संरचनाएं हैं जिनकी नौकरी एक सूची वापस करना है। उस सूची को त्यागने के लिए muddled कोड के लिए बनाता है, सूची की अवधारणा पर अस्पष्ट। मैं कभी भी उन संदर्भों में से किसी एक का उपयोग नहीं करता हूं जो शून्य संदर्भ में हैं।

मुझे टर्नरी सशर्त ऑपरेटर के बारे में वैसे ही लगता है। इसका काम एक मूल्य वापस करना है, इसलिए शून्य संदर्भ में इसका उपयोग करना कोई समझ नहीं आता है और सिर्फ लोगों को भ्रमित करता है।

उस ने कहा, मैं भीPerl::Critic या यहां तक ​​कि पीबीपी में अधिक स्टॉक नहीं डालूंगा। मुझे लगता है कि यह बेहतर है कि पुस्तक मौजूद नहीं है, लेकिन लोग अक्सर पूरे बिंदु को गलत समझते हैं और इसे ब्लडजोन के रूप में उपयोग करते हैं।

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