下面是使用 Rakudo 的 REPL 会话。
> my Int $x = 1
1
> dd $x
Int $x = 1
Nil
Run Code Online (Sandbox Code Playgroud)
为什么Nil输出的第二行有一个dd?
> sub mydd( $foo ) { dd $foo; "hello" }
&mydd
> mydd $x
1
hello
Run Code Online (Sandbox Code Playgroud)
Nil 是 的返回值dd,或者准确地说是缺少返回值。
它不是“的输出dd”,而是基于dd.
更详细...
在[R在REPL读取输入线(dd ...)。
该Ë评估线。它是dd,所以它打印一行以换行符结尾。
在P打印另一行,在新行也结束。如果上一步中的评估未在 STDOUT 上产生输出,则此步骤产生的行包括该评估返回的值。
(然后L循环等待下一行输入。)
按 Enter 后您看到的第一行是由dd.
您看到的第二行是 REPL 生成的输出。
默认情况下,第二行的内容是REPL的.gist被返回的值dd。返回值dd是 (always) Nil。所以这就是你所看到的。
(自从发布此 SO 后,Liz 添加了一个新的环境变量,让用户告诉 Rakudo 调用什么方法;.gist现在只是默认值。)
Raku 中的 REPL 检查执行的代码是否对STDOUT. 这样做的前提是假设如果您的代码输出某些内容,您会对其感兴趣,而不是您刚刚执行的表达式的返回值。这就是为什么:
> say 42
42
Run Code Online (Sandbox Code Playgroud)
将只显示42与不还显示的返回值say(这恰好是TrueBTW)。它并没有检查STDERR。检查这个note:
> note 42
42
True
Run Code Online (Sandbox Code Playgroud)
note与 相同say,但将其输出放在STDERR而不是 上STDOUT。这同样适用于dd. 所以这就是为什么你也得到这个dd:
> dd 42
42
Nil
Run Code Online (Sandbox Code Playgroud)
除了 的实现dd正在返回,Nil因为它旨在作为调试辅助工具,应尽可能少地干扰其环境。