2017-05-04 9 views
5

unwrapメソッドがありますが、それは私が使用するはずの方法です それは使用されるべき方法ではありません。これは、 スタンドアロンルーチンか、別のクラスのメソッドのいずれかである必要があります。私は何が欠けていますか?なぜPerl 6のunwrapメソッドがルーチンのメソッドですか?

が引数として正しいRoutine::WrapHandleのthingyを取得する限り、その呼び出し元が何であるかは気にしないようです。この 例では、I 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

インターフェイスは一方向(情報を保持し、「パッシブ」ハンドルを削除できるルーチン)で設計されましたが、別のものを実装しました。 。 (CF core/Routine.pm:110..113)に実際にされていますが、この方法はrestoreと呼ばれ、Routine.unwrap単に代表者:

unwrapは、おそらくハンドルの方法であるべきという考えについては

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

あなたがしたい場合全編はのほかにPerl6::Metamodel::WrapDispatcherがあり、Perl6/Metamodel/Dispatchers.nqpに定義されています。私が見ることから、私は確かに私が推測した元の設計を実装することが可能でなければなりませんが、それは実際にそれを行うには、問題について十分に強く感じる誰かが必要になります...

+1

[WrapHandleはプライベートです] (https://docs.perl6.org/type/Routine)ので、私はその道を下っていませんでした。実際には 'Routine :: WrapHandle'を返すので、修正する必要があります。 –

関連する問題