我在2018.01玩这个:
my $proc = Proc.new: :out;
my $f = $proc.clone;
$f.spawn: 'ls';
put $f.out.slurp;
Run Code Online (Sandbox Code Playgroud)
它说不能这样做.奇怪的是,错误消息是关于我没有使用的例程和不同的类:
Cannot resolve caller stdout(Proc::Async: :bin); none of these signatures match:
(Proc::Async:D $: :$bin!, *%_)
(Proc::Async:D $: :$enc, :$translate-nl, *%_)
in block <unit> at proc-out.p6 line 3
Run Code Online (Sandbox Code Playgroud)
Everything继承了一个默认clone方法Mu,它做了一个浅层克隆,但这并不意味着一切都有意义克隆.这尤其适用于可能包含对OS级别事物的引用的对象,例如Proc或IO::Handle.作为设计的人Proc::Async,我可以肯定地说,使它做任何有用的事情clone都不是设计考虑因素.我没有设计Proc,但我怀疑同样适用.
至于错误,请记住,Perl 6标准库是在Perl 6中实现的(很像Java和.Net,但不像Perl 5,默认情况下提供的很多东西都直接用C语言编写) .在这种特殊情况下,Proc就实施而言Proc::Async.Rakudo尝试稍微修剪堆栈跟踪以消除设置内部的调用,这通常是语言用户的胜利,但在这种情况下可能会有所帮助.使用--ll-exception旗帜运行Rakudo 可提供完整的详细信息,从而更清楚地了解正在发生的事情.