2017-05-04 82 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',所以這也是需要解決的問題。 –

相關問題