2017-05-04 90 views
5

有一个unwrap方法,但似乎我应该使用 它不是它应该使用的方式。它似乎应该是一个 独立程序或不同类中的方法。我错过了什么?为什么Perl 6的unwrap方法是一个例程方法?

它似乎并不关心它的调用者是什么,只要它作为参数得到正确的Routine::WrapHandle thingy。在此 例子,我wrap子程序,并得到一个WrapHandle

sub add-two-numbers ($n, $m) { $n + $m } 

sub do-some-stuff ($n, $m, $o) { 
    add-two-numbers( $n max $m, $m max $o); 
    } 

put do-some-stuff(5, 10, 15); 

# now I want to look into do-some-stuff to see what it's 
# passing 
my $wraphandle = &add-two-numbers.wrap: { 
    say "Arguments were (@_[])"; 
    callwith(|@_); 
    } 

put do-some-stuff(5, 10, 15); 

然后,我可以创造一个不同的,不相关的常规,并呼吁对unwrap

my &routine = sub { 1 }; 
&routine.unwrap($wraphandle); 

put do-some-stuff(5, 10, 15); 

的调用者来unwrap似乎是多余的。事实上,我可以把它作为一个 类的方法,它仍然有效:

Routine.unwrap($wraphandle); 

但是,看来这应该是某个程序(因为调用者 无所谓):

unwrap($wraphandle); # doesn't exist 

或者对自认为Routine::WrapHandle的方法是在 行为的来源:

$wraphandle.unwrap; # but, this method doesn't exist in that class 

所以,我错过这个 方法?

回答

5

有人猜测,接口被设计为一种方式(例程保持信息并且能够移除'被动'手柄),但实现了另一种方式(手柄已经保存了所有必需的信息,因此它可以自行解包) 。

至于观念unwrap或许应该是在手柄上的方法:它实际上是,但该方法被称为restore,这Routine.unwrap仅仅委托给(CF core/Routine.pm:110..113):

method unwrap($handle) { 
    $handle.can('restore') && $handle.restore() || 
     X::Routine::Unwrap.new.throw 
} 

如果你想除以外,还有中定义的Perl6::Metamodel::WrapDispatcher。从我所看到的情况来看,它肯定应该可以实现我推测的原始设计,但是它需要有人对此问题足够强烈,才能真正做到这一点......

+1

包装文档提到[WrapHandle是私人的] (https://docs.perl6.org/type/Routine),所以我没有走这条路。它实际上返回'Routine :: WrapHandle',所以这也是需要解决的问题。 –

相关问题