有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 );
然后,我可以创建一个不同且不相关的例程并调用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
那么,我对这种方法缺少什么?
答案 0 :(得分:5)
猜测,界面是以一种方式设计的(日常保存信息并能够删除'被动'句柄),但实现了另一种方式(句柄已经保留了所有必需的信息,因此它可以自行解包)。
关于Routine.unwrap
或许应该是句柄上的方法的概念:它实际上是,但该方法被称为method unwrap($handle) {
$handle.can('restore') && $handle.restore() ||
X::Routine::Unwrap.new.throw
}
,Perl6::Metamodel::WrapDispatcher
仅仅委托给({{1}} 3}}):
{{1}}
如果您想要完整的故事,除了core/Routine.pm:110..113之外,core/Routine.pm中还定义了{{1}}。从我所看到的,当然应该可以实现我猜想的原始设计,但是需要有人对这个问题有足够的感觉来实际做到这一点......