2014-10-10 10 views
5

Ich erwarte, dass eine while-Schleife die letzte Anweisung zurückgibt, die sie ausführt, aber eine Funktion scheint das nicht zurückzugeben.Ruby: warum tun while und bis nicht die letzte Zeile, die sie von einer Funktion ausführen?

(1) Dieses ..

[10] pry(main)> counter = 0 
=> 0 
[11] pry(main)> a = counter+=1 while counter < 10 
=> nil 
[12] pry(main)> a 
=> 10 

(2) Das funktioniert nicht, wie ich es erwartet zu funktionieren scheint. Ich erwarte, dass 10 zurückgegeben und in b gespeichert wird.

[19] pry(main)> def increment(terminal_value) 
[19] pry(main)* counter = 0 
[19] pry(main)* while counter < terminal_value 
[19] pry(main)*  counter+=1 
[19] pry(main)* end 
[19] pry(main)* end 
=> :increment 
[20] pry(main)> b = increment(10) 
=> nil 
[21] pry(main)> b 
=> nil 

Fragen:

  • Warum, in (1), tut nil aus der Zuweisungsanweisung zurückerhalten?
  • Warum wird b nicht zugewiesen 10?

Update:

Wie @DaveNewton erwähnt, in (1), dachte ich, ich tat:

a = (counter +=1 while counter < 10) 

aber ich war tatsächlich tun:

(a = counter +=1) while counter < 10 
+1

Du bist verschiedene Dinge tun. * (1) * erhält ein 'nil' und zeigt es an, ebenso * (2) *.In * (1) * erhöhen Sie eine lokale Variable "counter" und zeigen sie an. In * (2) * setzen Sie eine lokale Variable "b" auf das Rückgabeergebnis von "increment", was "nil" ist. –

+0

Wow. Danke @DaveNewton für diesen Leckerbissen! – kubasub

Antwort

5

In beiden Beispielen, die while Schleife Ergebnis ts als nil.

Von while loop:

Das Ergebnis einer while Schleife ist nil es sei denn break verwendet wird, um einen Wert zu liefern.

Das gleiche gilt für until:

Wie ein while Schleife das Ergebnis einer until Schleife nil ist, es sei denn break verwendet wird.

+0

@KubaSub 'a' hat den Wert der Zuweisung' counter + = 1', nicht die 'while' Schleife. –

+0

danke für die Aufklärung! – kubasub

0

Ergänzung von Yu Hao Antwort ist die Antwort auf this Frage, die in Ruby

Jede Aussage besagt, liefert den Wert des letzten ausgewerteten Ausdrucks.

und nach dieser Logik, wenn Sie Ihren Code ändern, um (nicht sagen, diese gute Praxis ist oder es, nur ein Beispiel Billigen):

def increment(terminal_value) 
    counter = 0 
    while counter < terminal_value 
     counter+=1 
    end 
    counter 
end 

b = increment(10) 

Es wird ausgegeben 10.

Verwandte Themen