为什么Perl 6的解包方法是常规方法?

时间:2017-05-04 22:31:20

标签: perl6

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

那么,我对这种方法缺少什么?

1 个答案:

答案 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}}。从我所看到的,当然应该可以实现我猜想的原始设计,但是需要有人对这个问题有足够的感觉来实际做到这一点......