Ruby Language Contrôle du flux avec des instructions logiques


Exemple

Bien que cela puisse sembler contre-intuitif, vous pouvez utiliser des opérateurs logiques pour déterminer si une instruction est exécutée ou non. Par exemple:

File.exist?(filename) or STDERR.puts "#{filename} does not exist!"

Cela vérifie si le fichier existe et n'imprime le message d'erreur que si ce n'est pas le cas. L'instruction or est paresseuse, ce qui signifie qu'elle cessera de s'exécuter une fois qu'il sera certain que sa valeur est vraie ou fausse. Dès que le premier terme est trouvé vrai, il n'est pas nécessaire de vérifier la valeur de l'autre terme. Mais si le premier terme est faux, il doit vérifier le second terme.

Une utilisation courante consiste à définir une valeur par défaut:

glass = glass or 'full' # Optimist! 

Cela définit la valeur du glass à «plein» si ce n'est pas déjà fait. Plus précisément, vous pouvez utiliser la version symbolique de or :

glass ||= 'empty' # Pessimist. 

Il est également possible d'exécuter la deuxième instruction uniquement si la première est fausse:

File.exist?(filename) and puts "#{filename} found!"

Encore une fois, and est paresseux donc il n'exécutera la deuxième instruction que si nécessaire pour arriver à une valeur.

L'opérateur or a une priorité inférieure à and . De même, || a une préséance inférieure à && . Les formes de symbole ont une priorité plus élevée que les formes de mot. Ceci est pratique pour savoir quand vous voulez mélanger cette technique avec l'affectation:

a = 1 and b = 2
#=> a==1
#=> b==2
a = 1 && b = 2; puts a, b
#=> a==2
#=> b==2

Notez que le Guide de style Ruby recommande :

Les mots clés and et or sont interdits. La lisibilité minimale ajoutée ne vaut tout simplement pas la forte probabilité d'introduire des bogues subtils. Pour les expressions booléennes, utilisez toujours && et || au lieu. Pour le contrôle de flux, utilisez if et unless ; && et || sont également acceptables mais moins clairs.