有一种unwrap方法,但似乎我应该使用它的方式不是它应该使用的方式.它似乎应该是一个独立的例程或一个不同类的方法.我错过了什么?
它似乎并不关心它的调用者是什么,只要它Routine::WrapHandle作为一个论点得到正确的东西.在这个例子中,我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 );
Run Code Online (Sandbox Code Playgroud)
然后,我可以创建一个不同的和不相关的例程并调用unwrap
它:
my &routine = sub { 1 };
&routine.unwrap( $wraphandle );
put do-some-stuff( 5, 10, 15 );
Run Code Online (Sandbox Code Playgroud)
这种unwrap看起来似乎是多余的.实际上,我可以将其称为类方法,它仍然有效:
Routine.unwrap( $wraphandle );
Run Code Online (Sandbox Code Playgroud)
但是,它似乎应该是一个常规(因为调用剂无关紧要):
unwrap( $wraphandle ); # doesn't exist
Run Code Online (Sandbox Code Playgroud)
或者一个方法,Routine::WrapHandle因为这是行为的来源:
$wraphandle.unwrap; # but, this method doesn't exist in that class
Run Code Online (Sandbox Code Playgroud)
那么,我对这种方法缺少什么呢?
猜测,界面是单向设计的(日常保存信息并能够删除'被动'句柄),但实现了另一个(句柄已经保留了所有必需的信息,因此它可以自行解包).
关于unwrap应该是句柄上的方法的概念:它实际上是,但调用方法restore,Routine.unwrap仅仅委托给(cf core/Routine.pm:110..113):
method unwrap($handle) {
$handle.can('restore') && $handle.restore() ||
X::Routine::Unwrap.new.throw
}
Run Code Online (Sandbox Code Playgroud)
如果你想要完整的故事,除了core/Routine.pm之外,还有Perl6/Metamodel/Dispatchers.nqp中的Perl6::Metamodel::WrapDispatcher定义.从我所看到的,当然应该可以实现我猜想的原始设计,但是需要有人对这个问题有足够的感觉才能真正做到这一点......