[Ruby] Über das Verhalten der Auswertung von bedingten Ausdrücken in while

Einführung

Ich habe das erste Verhalten bei der Verwendung von while festgestellt. Notieren Sie sich dies.

Umgebung

ruby: 2.7.1

Phänomen

Phänomen_A

a = 0

while
  if a == 5
    break
  end
  a += 1
end

puts a
#Ausführungsergebnis: 0

Phänomen_B

b = 0

while
  b += 1
  if b == 5
    break
  end
end

puts b
#Ausführungsergebnis: 5

Phänomen_C

c = 0

while c < 5 do
  c += 1
end

puts c
#Ausführungsergebnis: 5

Phänomen_D

d = 0

loop do
  if d == 5
    break
  end
  d += 1
end

puts d
#Ausführungsergebnis: 5

Phänomen _E

e = 0

loop do
  e += 1
  if e == 5
    break
  end
end

puts e
#Ausführungsergebnis: 5

Als Ergebnis erwartete ich, dass "5" sogar im Phänomen _A ausgegeben werden würde.

Warum passiert das?

(Es wurde durch @ scivolas Kommentar gelöst.)

Anscheinend wird der Ausdruck unmittelbar nach "while" als bedingter Ausdruck ausgewertet. Mit anderen Worten, in diesem Phänomen_A,

if a == 5
  break
end

Dieser Teil wird zum ersten Mal als bedingter Ausdruck von "while" ausgewertet, und natürlich wird "a == 5" zu "false" und der Wert des "if" -Ausdrucks zu "nil", sodass es den Anschein hat, als sei er aus der Schleife entkommen.

Übrigens sind in Ruby alle Werte außer "nil" und "false" "true".

Wenn ich einen bedingten Ausdruck wie folgt gab, wurde die Verarbeitung in der Schleife ausgeführt.

a = 0

while true do #do ist optional
  if a == 5
    break
  end
  a += 1
end

puts a
#Ausführungsergebnis: 5

Die Falle dieser Zeit war, dass die Formel innerhalb der Schleife tatsächlich eine bedingte Formel war.

Verlauf bearbeiten

2020/07/04 17:11 In dem Kommentar erklärte @scivola die Ursache des Problems und ich bearbeitete "Warum dies passiert". 2020/07/04 17:31 Ich habe den Titel geändert, um ihn dem Inhalt anzupassen, und den Text ein wenig kalibriert.

Bemerkungen

Normalerweise verwende ich nicht "while" oder "loop", sondern eine andere iterative Methode.

Recommended Posts

[Ruby] Über das Verhalten der Auswertung von bedingten Ausdrücken in while
Über das Verhalten von Ruby Hash # ==
Reihenfolge der Routenauswertung in Spark
Verzeichnisinformationen von DEFAULT_CERT_FILE in Mac Ruby 2.0.0
Zusammenfassung der Hashes und Symbole in Ruby
[Einführung in Ruby] Über die Rolle von true und break in der while-Anweisung
[Ruby] Schleifenunterscheidung und Verwendung in Ruby
Unerwartetes Verhalten der Standardnachricht in org.springframework.context.MessageSource.getMessage ()
Ruby bedingter Zweig (case, while, Endlosschleife, break)
Verhalten, wenn Platzhalter (**) in Ruby angegeben ist
Empfehlung der Serviceklasse in Ruby on Rails
Zählen Sie eine Teilmenge eines in Ruby angegebenen Arrays auf (+ α).
Grundlagen von Ruby
Schwer in Rubin! ??
Ruby regulärer Ausdruck
Verhalten von ThreadPoolTaskExecutor
[Ruby] Verwendung der Standardausgabe bei der bedingten Verzweigung
[Ruby] Die Rolle von Indizes beim Lernen von Elementen in Arrays
Informationen zum Hinzufügen von Variablen in der iterativen Verarbeitung in der while-Anweisung
Rufen Sie die URL des HTTP-Umleitungsziels in Ruby ab
Umgang mit Datum und Uhrzeit in Ruby. Verwenden Sie Datum und Uhrzeit richtig.
[Java] Es scheint, dass Sie nicht "0 <hoge <10" in den bedingten Ausdruck der "if" -Anweisung schreiben können.