2017-05-04 17 views
5

एक unwrap विधि है, लेकिन जिस तरह से मुझे लगता है कि मुझे का उपयोग करना चाहिए, इसका उपयोग नहीं किया जाना चाहिए। ऐसा लगता है कि यह या तो स्टैंडअलोन दिनचर्या या एक अलग वर्ग में एक विधि होना चाहिए। मैं क्या खो रहा हूँ?पर्ल 6 की अनचाहे विधि रूटीन की विधि क्यों है?

ऐसा प्रतीत होता है कि यह परवाह नहीं करता है कि जब तक यहसही होता है तो 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); 

invocant को unwrap अनावश्यक लगता है। दरअसल, मैं इसे एक वर्ग पद्धति के रूप में कॉल कर सकते हैं और यह अभी भी काम करता है:

Routine.unwrap($wraphandle); 

लेकिन, ऐसा लगता है यह या तो एक नियमित (के बाद से invocant कोई फर्क नहीं पड़ता) होना चाहिए:

unwrap($wraphandle); # doesn't exist 

$wraphandle.unwrap; # but, this method doesn't exist in that class 

तो, मैं इस बारे में क्या याद आ रही है:

या Routine::WrapHandle कि चूंकि पर एक विधि व्यवहार का स्रोत है तरीका?

उत्तर

5

अनुमान में, इंटरफ़ेस को एक तरह से डिजाइन किया गया था (नियमित रूप से जानकारी रखने और 'निष्क्रिय' हैंडल को हटाने में सक्षम होने के साथ), लेकिन एक और लागू किया गया (हैंडल के साथ पहले से ही सभी आवश्यक जानकारी को रखने के लिए ताकि यह स्वयं को अनदेखा कर सके) ।

धारणा है कि unwrap शायद हैंडल पर एक विधि होना चाहिए करने के लिए के रूप में: यह वास्तव में है, लेकिन विधि restore कहा जाता है, जो Routine.unwrap केवल (सीएफ core/Routine.pm:110..113) के प्रतिनिधियों:

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

यदि आप चाहते हैं के अलावा पूरी कहानी Perl6::Metamodel::WrapDispatcherPerl6/Metamodel/Dispatchers.nqp में परिभाषित भी है। जो मैं देख सकता हूं, उससे निश्चित रूप से अनुमानित मूल डिजाइन को लागू करना संभव है, लेकिन इसे किसी को वास्तव में इस मुद्दे के बारे में पर्याप्त रूप से पर्याप्त महसूस करने की आवश्यकता होगी ...

+1

रैप दस्तावेज़ों ने उल्लेख किया कि [लपेटें निजी है] (https://docs.perl6.org/type/Routine), इसलिए मैं उस पथ से नीचे नहीं गया। यह वास्तव में 'routine :: WrapHandle' देता है, इसलिए यह भी ठीक करने के लिए कुछ है। –

संबंधित मुद्दे