2015-08-06 8 views
5

Ich habe gerade festgestellt, dass die Deklaration der Iterationsvariablen nicht außerhalb der für beide gleichermaßen auf den Fall der traditionellen for-Schleife erfolgen kann.Verwendung von for-jeder Iteration und Deklaration der Iterationsvariablen extern

Say für zB die folgenden unten nicht möglich:

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

Aber mit traditionellen for-Schleife, ich auch draußen die Iterationsschleife Regelgröße erklären konnte, so dass ich es wiederverwendet werden kann oder für die letzte bekommen Wert außerhalb der Schleife.

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

Warum eine solche Einschränkung für for-jedes Schleifenkonstrukt beibehalten wird? Ich stimme zu, dass die Iterationsvariable nur in der for-each-Schleife einen Wert erhalten kann. Aber warum nicht extern verwenden, um es für einen Standardwert oder den letzten Elementwert aus der Schleife zu behalten und zu verwenden? Diese Einschränkung sieht jedoch so naiv aus und fühlte sich wie etwas von meiner Freiheit an, bevor das herausgenommen wird. Wenn so etwas möglich wäre, würde ich einen Code wie folgt geschrieben:

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); 
} 

, so dass, wenn meine Saiten Array leer ist, würde ich eine anmutige Meldung wie „Ich konnte nicht durchlaufen, also was ich kann Ihnen zeigen, ist Standard ". Wenn mein Zeichenfolgenarray die Elemente wie oben enthält, könnte ich die Nachricht als "Ich habe eine für jede Iteration und mein letzter Wert ist Last" ohne eine zusätzliche boolesche Variable sehen, um zu prüfen, ob ich in die Schleife gegangen bin oder nicht.

Auch auf diese Erzwingen von Iterationsvariable Erklärung zu tun, ich bin zu einem anderen Problem mit Namespace-Konflikten konfrontiert:

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 
} 

Einige könnte man erkennen, dass als persönlichen Geschmack. Das Sprachkonstrukt könnte jedoch wann immer möglich vielseitig genug sein. Ich sehe keinen triftigen Grund, diese Einschränkung des Geltungsbereichs insbesondere für for-each beizubehalten. Macht das Sinn? Lass mich wissen was du denkst.

+0

Es wird als eine gute Methode angesehen, Variablen mit einem so begrenzten Umfang wie möglich zu deklarieren; IMO, Wiederverwendung der Variablen außerhalb der for-Schleife macht den Code schwerer zu lesen (und fehleranfälliger). –

+0

Ich stimme zu, aber alles was ich sage ist, dass eine Sprache mich nicht auf solche Dinge beschränken darf. –

Antwort

0

Leider werden Sie die Verwendung einer temporären Variablen machen müssen, etwa so:

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

Hinweis: Der Name der temporären Variablen Sie als die Schleifenvariable anders entscheiden müssen.

Für die Design-Wahl der Schleife, ich denke, wir müssen es zu einer syntaktischen Aufsicht (ironisch auf ein Symbol als syntaktischer Zucker verwendet), dass Sie nicht vordeklarieren den Wert haben können.

Wie würden Sie anhand Ihrer zweiten Frage unterscheiden, welche string Sie versuchen zu referenzieren?

Verwandte Themen