[Ruby] À propos du comportement d'évaluation des expressions conditionnelles dans while

introduction

J'ai rencontré le premier comportement lors de l'utilisation de while, alors notez-le.

environnement

ruby: 2.7.1

phénomène

Phenomenon_A

a = 0

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

puts a
#Résultat de l'exécution: 0

Phenomenon_B

b = 0

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

puts b
#Résultat d'exécution: 5

Phenomenon_C

c = 0

while c < 5 do
  c += 1
end

puts c
#Résultat d'exécution: 5

Phenomenon_D

d = 0

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

puts d
#Résultat d'exécution: 5

Phénomène _E

e = 0

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

puts e
#Résultat d'exécution: 5

En conséquence, je m'y attendais, je pensais que «5» sortirait même dans le phénomène _A.

Pourquoi cela arrive

(Il a été résolu par le commentaire de @ scivola.)

Apparemment, l'expression immédiatement après «while» est évaluée comme une expression conditionnelle. En d'autres termes, dans ce phénomène_A,

if a == 5
  break
end

Cette partie a été évaluée pour la première fois comme une expression conditionnelle de «while», et bien sûr «a == 5» est devenu «faux» et la valeur de «si» expression est devenue «nil», il semble donc qu'elle était hors de la boucle.

D'ailleurs, dans Ruby, toutes les valeurs sauf «nil» et «false» sont «true».

Lorsque j'ai donné une expression conditionnelle comme suit, le traitement dans la boucle a été exécuté.

a = 0

while true do #faire est facultatif
  if a == 5
    break
  end
  a += 1
end

puts a
#Résultat d'exécution: 5

Le piège de cette époque était que la formule à l'intérieur de la boucle était en fait une formule conditionnelle.

Modifier l'historique

2020/07/04 17:11 Dans le commentaire, @scivola a expliqué la cause du problème, j'ai donc édité "Pourquoi cela se produit". 2020/07/04 17:31 J'ai changé le titre pour qu'il corresponde au contenu et calibré un peu le texte.

Remarques

Je n'utilise généralement pas while ou loop, mais j'utilise une autre méthode itérative.

Recommended Posts

[Ruby] À propos du comportement d'évaluation des expressions conditionnelles dans while
À propos du comportement de ruby Hash # ==
Ordre d'évaluation de l'itinéraire dans Spark
Informations de répertoire de DEFAULT_CERT_FILE dans Mac ruby 2.0.0
Résumé des hachages et symboles dans Ruby
[Introduction à Ruby] À propos du rôle de true et break in the while statement
[Ruby] Distinction et utilisation des boucles dans Ruby
Comportement inattendu du message par défaut dans org.springframework.context.MessageSource.getMessage ()
Branche conditionnelle Ruby (cas, while, boucle infinie, rupture)
Comportement lorsque le caractère générique (**) est spécifié dans ruby
Recommandation de classe de service dans Ruby on Rails
Énumérer un sous-ensemble d'un tableau donné en Ruby (+ α)
Bases de Ruby
Lourd en rubis! ??
Expression régulière Ruby
Comportement de ThreadPoolTaskExecutor
[Ruby] Comment utiliser la sortie standard dans le branchement conditionnel
[Ruby] Le rôle des indices dans l'apprentissage des éléments dans les tableaux
À propos de l'ajout de variables dans le traitement itératif dans l'instruction while
Obtenez l'URL de la destination de la redirection HTTP dans Ruby
Traitement de la date et de l'heure en Ruby. Utilisez correctement la date et l'heure.
[Java] Il semble que `0 <hoge <10` ne puisse pas être écrit dans l'expression conditionnelle de l'instruction ʻif`.