Ruby while syntax

8

Weiß jemand, warum ich das schreiben kann:

%Vor%

Das sieht so aus, als würde man einen Block an while übergeben. Und nicht:

%Vor%

Liegt es daran, dass das "do" der while-Syntax nur syntaktischer Zucker ist und nichts mit dem "tun" eines Blocks zu tun hat?

    
hellvinz 26.10.2010, 17:36
quelle

2 Antworten

12
  

Ist das do der while -Syntax nur syntaktischer Zucker und nichts mit do eines Blocks zu tun?

Mehr oder weniger, ja. Es ist kein syntaktischer Zucker, es ist einfach ein eingebautes Sprachkonstrukt, wie def oder class , wie @meagar bereits geschrieben hat.

Es hat nichts mit dem do eines Blocks zu tun, außer dass Keywords teuer sind und daher die Wiederverwendung von Keywords sinnvoll ist. (Mit "teuer" meine ich, dass sie den Programmierer in seiner Ausdruckskraft einschränken.)

In einer while -Schleife gibt es zwei Möglichkeiten, den Block von der Bedingung zu trennen:

  1. das Schlüsselwort do und
  2. ein Ausdruckseparator.

Es gibt wiederum zwei verschiedene Ausdrucksseparatoren in Ruby:

  1. das Semikolon ; und
  2. ein Zeilenumbruch

Also sind alle drei der folgenden Punkte gültig:

%Vor%

[Natürlich würde das letzte nicht so geschrieben werden, du würdest das end in eine neue Zeile schreiben, passend zum while . Ich wollte nur zeigen, was das Minimum ist, um die Teile der while Schleife zu trennen.]

Übrigens: Es ist höchst uninformiert, die Bedingung in Klammern zu setzen. Es gibt auch viele überflüssige Semikola in Ihrem Code. Und der Variablenname i ist normalerweise für einen Index reserviert, kein Element. (Normalerweise verwende ich el für generische Elemente, aber ich bevorzuge mehr semantische Namen.)

Es ist auch sehr unwichtig, eine Sammlung manuell zu iterieren. Ihr Code wäre viel besser geschrieben als

%Vor%

Es ist nicht nur viel einfacher zu verstehen, was dies bewirkt (drucke alle Elemente des Arrays und lösche alle Elemente daraus), es ist auch viel einfacher zu schreiben (es gibt keine Möglichkeit, die Abbruchbedingung falsch zu bekommen oder zu schinden irgendwelche Zuordnungen). Es ist auch effizienter: Ihre Version ist Θ (n 2 ), diese ist Θ (n).

Und das ist auch nicht so, wie Sie es schreiben würden, denn Kernel#puts implementiert dieses Verhalten sowieso schon. Also, was Sie wirklich schreiben würden, ist dies

%Vor%

oder vielleicht das

%Vor%

[Hinweis: Dieser allerletzte ist nicht 100% äquivalent. Es druckt einen Zeilenumbruch für ein leeres Array, alle anderen drucken nichts.]

Einfach. Klar. Prägnant. Ausdrucksvoll. Schnell.

Vergleichen Sie das mit:

%Vor%

Ich musste das sogar mehrmals ausführen, um 100% klar zu sein, was es tut.

    
Jörg W Mittag 27.10.2010, 01:36
quelle
6

while nimmt keinen Block, es ist ein Sprachkonstrukt. Das do ist optional:

%Vor%     
meagar 26.10.2010 17:42
quelle

Tags und Links