2015-08-06 9 views
5

मैंने अभी देखा है कि पुनरावृत्ति चर की घोषणा प्रत्येक के लिए पारंपरिक रूप से लूप के मामले में नहीं की जा सकती है।प्रत्येक पुनरावृत्ति के लिए उपयोग और पुनरावृत्ति परिवर्तनीय बाहरी रूप से

कहते हैं उदाहरण के लिए, नीचे दिए गए निम्न संभव नहीं है:

String str; 
for(str : strings) { 
    // Do something 
} 

लेकिन पाश के लिए पारंपरिक के साथ, मैं बाहर भी यात्रा लूप नियंत्रण चर घोषित कर सकता है, ताकि मैं इसे पुन: उपयोग कर सकते हैं या पिछले प्राप्त करने के लिए लूप के बाहर मूल्य।

int i; 
for(; i < strings.length; i++) { 
    // Do something 
} 
System.out.println("I iterated upto " + i); 

प्रत्येक लूप निर्माण के लिए इस तरह के प्रतिबंध क्यों रखा जाता है? मैं मानता हूं कि पुनरावृत्ति परिवर्तक केवल प्रत्येक लूप के साथ ही एक मान प्राप्त कर सकता है। लेकिन इसे डिफ़ॉल्ट मान या लूप से अंतिम तत्व मान के लिए इसे रखने और उपयोग करने के लिए बाहरी रूप से इसका उपयोग क्यों न करें? हालांकि, यह प्रतिबंध इतना बेवकूफ़ दिखता है और इससे पहले कि मेरी स्वतंत्रता की तरह कुछ महसूस किया जाता है। अगर ऐसी बात संभव हो गया था, मैं इस तरह एक कोड लिखा होता:

String[] strings = new String[]{"First", "Middle", "Last"}; 
String str = "Default"; 
for(str : strings) { 
    // Do something. 
} 
if(str.equals("Last") { 
System.out.println("I did a for each iteration and my last value is " + str); 
} else { 
System.out.println("I couldn't iterate, so what I can show you is " + str); 
} 

तो है कि, अगर मेरी तार सरणी खाली है, मैं एक सुंदर संदेश दिखाई के रूप में "मैं पुनरावृति नहीं कर सकता हैं, तो क्या मैं दिखा सकता है कि आप डिफ़ॉल्ट हैं "। यदि मेरी स्ट्रिंग सरणी में उपरोक्त तत्व हैं, तो मैं संदेश को "प्रत्येक पुनरावृत्ति के लिए किया था और मेरा अंतिम मान अंतिम है" बिना अतिरिक्त बूलियन चर के बिना यह जांचने के लिए कि क्या मैं लूप के अंदर गया था या नहीं।

इसके अलावा यात्रा चर घोषणा के इस लागू करने के लिए करते हैं, मैं नाम स्थान संघर्ष भी साथ एक और समस्या का सामना कर रहा हूँ:

String string = "Hello"; 
----------------------- 
----------------------- 
for(String string : strings) { // I am forced to use a different name for string, though I prefer to use as a string only for my conventional semantics. 
    // Do something 
} 

कुछ एक अनुभव हो सकता है कि एक व्यक्तिगत स्वाद के रूप में है। हालांकि, जब भी संभव हो, भाषा निर्माण बहुमुखी हो सकता था। मुझे विशेष रूप से प्रत्येक के लिए दायरे के इस प्रतिबंध को रोकने के लिए कोई वैध कारण नहीं दिख रहा है। क्या इस का कोई मतलब निकलता है? मुझे अपने विचारों को जानने दें।

+0

इसे यथासंभव सीमित दायरे के साथ चर घोषित करने का एक अच्छा अभ्यास माना जाता है; आईएमओ, लूप के बाहर परिवर्तनीय का पुनः उपयोग करने से कोड को पढ़ने में कठिनाई होती है (और अधिक त्रुटि-प्रवण)। –

+0

मैं सहमत हूं, लेकिन मैं बस इतना कह रहा हूं कि, ऐसी भाषा मुझे ऐसी चीजों पर सीमित नहीं करनी चाहिए। –

उत्तर

0

दुर्भाग्य से, आप एक अस्थायी चर का उपयोग करना है, तो तरह होगा:

String tmp = "default"; 
for(String str : strings) { 
    tmp = str; 
    // Do something 
} 
//tmp here is the last used value in the loop 
//And other stuff 

नोट: अस्थायी चर आप चुनते के नाम पाश चर से अलग होना चाहिए।

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

आपके दूसरे प्रश्न के अनुसार, आप string के बीच अंतर कैसे करेंगे, आप संदर्भित करने की कोशिश कर रहे हैं?

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