我在2018.01玩这个:
my $proc = Proc.new: :out;
my $f = $proc.clone;
$f.spawn: 'ls';
put $f.out.slurp;
它说不能这样做。很奇怪错误信息是关于我没有使用的例程和不同的类:
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
答案 0 :(得分:6)
Everything从clone
继承了一个默认的Mu
方法,它做了一个浅层克隆,但这并不意味着克隆一切都有意义。这尤其适用于可能包含对操作系统级别事物的引用的对象,例如Proc
或IO::Handle
。作为设计Proc::Async
的人,我可以肯定地说,在clone
上做任何有用的事情都不是设计考虑因素。我没有设计Proc
,但我怀疑同样适用。
至于错误,请记住,Perl 6标准库是在Perl 6中实现的(很像Java和.Net,但不像Perl 5,默认情况下提供的许多内容都直接写入在C)。在这种特殊情况下,Proc
是根据Proc::Async
实现的。 Rakudo尝试稍微修剪堆栈跟踪以消除设置内部的调用,这通常是语言用户的胜利,但在这种情况下可能会有所帮助。使用--ll-exception
标志运行Rakudo可提供完整的详细信息,从而更清楚地了解正在发生的事情。