8 votes

Le mot-clé `do` exécute-t-il un bloc ou le traite-t-il comme une expression ?

Les documents indique que "la manière la plus simple d'exécuter un bloc lorsqu'il ne peut pas être une déclaration autonome est d'écrire do avant elle" et donne l'exemple suivant :

# This dies half of the time 
do { say "Heads I win, tails I die."; Bool.pick } or die; say "I win.";

Cependant, do ne semble pas entraîner l'exécution de tous les blocs. En particulier, il ne semble pas exécuter les blocs comportant une signature :

do -> $a = 42 { say "ran with $a"; 0 } or die; say 'done'; # OUTPUT: «done»

Serait-il donc préférable de dire que do traite un bloc comme une expression qui parfois le fait fonctionner ? Ou bien le comportement de Rakudo est-il incorrect ? Ou ma compréhension est-elle erronée ?

5voto

raiph Points 8552

D'après ce que l'on sait :

  • Comme tous les "préfixes de déclaration", do consomme un "blorst" (bloc ou déclaration) sur sa droite et le traite comme une déclaration.

  • do est qu'il évalue la valeur de la (dernière) instruction. Je pense que c'est le seul sens dans lequel il y a un sens d'"expression" dans son fonctionnement.

Ce comportement interagit avec les comportements suivants, qui ne sont pas liés à l'activité de l'entreprise do :

  • Lorsqu'un bloc "nu" ( {...} ) est traitée comme une déclaration, elle exécute le bloc.

  • D'autres blocs, traités comme des déclarations, ne le font pas (ou ne le font pas). ne devrait pas ), courir.

Je pense que la solution à la phrase du document est quelque chose comme :

La façon la plus simple d'exécuter un nu bloc où il ne peut être ne se comporte pas comme une déclaration autonome est en écrivant do avant elle"

Cependant, je ne sais pas où/si le document parle de la différence entre les blocs nus et les autres blocs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X