राकू में कैसे लागू करें


13

पर्ल में, का उपयोग करके Moo, आप aroundउप को लागू कर सकते हैं , जो एक कक्षा में अन्य तरीकों के चारों ओर लपेटेगा।

around INSERT => sub {
    my $orig = shift;
    my $self = shift;

    print "Before the original sub\n";
    my $rv  = $orig->($self, @_);
    print "After the original sub\n";
};

इस व्यवहार को राकू में कैसे लागू किया जा सकता है , अधिमानतः एक का उपयोग करके role?

जवाबों:


8

आप भूमिका के साथ विधि को छाया कर सकते हैं और फिर उपयोग कर सकते हैं callwith:

class Foo {
    method meth { say 2 }
}

my $foo = Foo.new but role :: {
    method meth(|c) { say 1; callwith(|c); say 3 }
};

$foo.meth

8

विधि :: संशोधक

Perl 5 के Moose के समान कक्षा के तरीकों को संशोधित करने के लिए पहले (), बाद () और आसपास () कार्यों के लिए उपयोग किए जाने वाले कार्य। यह आंतरिक रूप से रैप () का उपयोग करता है, और आवरण हैंडलर को लौटाता है, इसलिए यह मूल (.restore) के लिए आसान है।

इस तरह से मॉड्यूल लागू होता है around:

sub around ($class, $method-name, &closure) is export
{
  $class.^find_method($method-name).wrap(method { closure(); });
}

6

उपयोग wrap

sub bar () { return "baþ" };

my $wrapped = &bar.wrap( { " → " ~ callsame() ~ " ← " } );

say bar(); # OUTPUT:  «→ baþ ← »

चूंकि तरीकों दिनचर्या हैं, तो आप विधि पर ही एक हैंडल पाने के लिए एक से थोड़ा अधिक घुमावदार तरीके की आवश्यकता होगी, लेकिन उस के अलावा अन्य, विधि बिल्कुल वैसा ही है, के बाद से Methodरों का एक उपवर्ग हैं Routineरों

class Baz {
    method bar () { return "baþ" };
}

my &method_bar = Baz.^find_method("bar");
my $wrapped = &method_bar.wrap( { " → " ~ callsame() ~ " ← " } );

say Baz.bar(); # OUTPUT:  «→ baþ ← »

$wrappedएक हैंडल कि, इस्तेमाल किया जा सकता बाद में, यह खोलने में अगर जरूरत है।

संपादित करें : उदाहरण के लिए, यहां से ली गई क्लास विधि पर एक हैंडल पाने के लिए कोड जोड़ना ।


लपेटें तरीकों को लपेट नहीं करता है
ugexe

@ ओफ़्क्से ओपी को संदर्भित करने के लिए स्पष्ट रूप से संदर्भित करता है। इसके अलावा, आप सिर्फ तरीकों के लिए इसका उपयोग कर सकते हैं, क्योंकि यह एक MethodहैRoutine
jjmerelo

मुझे लगता है कि आप भ्रमित हैं। यह प्रश्न स्वयं बताता है कि 'एक कक्षा में अन्य तरीकों के आसपास लपेटो।' Mooएस के आसपास सबरूटिन लपेटने जैसा कुछ नहीं है।
उग्ये

@ एक ही अंतर है। तरीके रूटीन हैं, जैसा कि मैंने संपादित करने के बाद कहा।
जैजेरिमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.