2009-03-13 9 views
3

Mit bestimmten Konstrukten habe ich die Wahl, ein Semikolon oder das do Schlüsselwort zu verwenden, um das Ende einer Anweisung zu begrenzen, wie mit dem until Beispiel unten.Kernel.loop Methode erfordert 'do'. Semikolon nicht erlaubt?

until x == 100 do puts x; x+=1 end 

until x == 100; puts x; x+=1 end 

Aber das ist nicht möglich mit Kernel.loop.

x=0  
loop do puts x; x+=1; break if x == 100 end 

x=0  
loop; puts x; x+=1; break if x == 100 end # => error 

Gibt es einen Grund, warum es so ist?

Antwort

6
  • loop ist ein Verfahren (in Kernel), die wirklich einen Block mit do...end oder { } erfordert.
  • while und until sind Anweisungen (wie if), und erwarten Sie keinen Block. Das do Schlüsselwort ist optional, aber es gibt nicht an, einen Block (z while x == 100 { puts x; x+=1; } wird kläglich scheitern, während loop { puts x; x+=1; break if x == 100 } gut funktionieren wird.)

So bedeutet do verschiedene Dinge in den beiden Fällen. Im Fall von loop (und anderen Methoden) bezeichnet es wirklich einen Block; im Fall von while, until usw. ist es nur syntaktischer Zucker (genau wie then ist nach if.) Lassen Sie sich nicht irreführen.

+0

Große Antwort. Vielen Dank. –

Verwandte Themen