你能克隆一个Perl 6 Proc吗?

时间:2018-04-26 18:55:22

标签: perl6 raku

我在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

1 个答案:

答案 0 :(得分:6)

Everything从clone继承了一个默认的Mu方法,它做了一个浅层克隆,但这并不意味着克隆一切都有意义。这尤其适用于可能包含对操作系统级别事物的引用的对象,例如ProcIO::Handle。作为设计Proc::Async的人,我可以肯定地说,在clone上做任何有用的事情都不是设计考虑因素。我没有设计Proc,但我怀疑同样适用。

至于错误,请记住,Perl 6标准库是在Perl 6中实现的(很像Java和.Net,但不像Perl 5,默认情况下提供的许多内容都直接写入在C)。在这种特殊情况下,Proc是根据Proc::Async实现的。 Rakudo尝试稍微修剪堆栈跟踪以消除设置内部的调用,这通常是语言用户的胜利,但在这种情况下可能会有所帮助。使用--ll-exception标志运行Rakudo可提供完整的详细信息,从而更清楚地了解正在发生的事情。