`do`关键字是运行块还是将其视为表达式?
该文件指出,“运行块地方不能是独立的语句最简单的方法是通过编写do之前”,并提供了下面的例子:
# This dies half of the time
do { say "Heads I win, tails I die."; Bool.pick } or die; say "I win.";
但是,do似乎不会导致所有块都运行。特别是,它似乎没有运行带有签名的块:
do -> $a = 42 { say "ran with $a"; 0 } or die; say 'done'; # OUTPUT: «done»
那么将do块视为有时会导致它运行的表达式会更好吗?还是乐堂在这里的行为不正确?还是我的理解不正确?
回答
AFAIK:
-
像所有“语句前缀”一样,
do在其右侧使用“blost”(块或语句)并将其视为语句。 -
do的唯一特殊功能是它计算(最后)语句的值。我认为这是在其操作中具有任何“表达”意义的唯一意义。
这与以下行为相互作用,这些行为与 无关do:
-
当“裸”块 (
{...}) 被视为语句时,它会运行该块。 -
其他块,被视为语句,不(或不应该)运行。
我认为对 doc 句子的修复类似于:
运行一个
不能运行的裸块的最简单方法是在它之前写入不作为独立语句的行为”do
虽然我不知道文档在哪里/是否谈论裸块和其他块之间的区别。