রাকুর আশেপাশে কীভাবে প্রয়োগ করা যায়


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

পদ্ধতি :: সংশোধনকারীদের

পূর্বে (), পরে () এবং এর চারপাশে () ফাংশনগুলি কার্যকর করে যা ক্লাস পদ্ধতিগুলি পরিবর্তনের জন্য পার্ল 5 এর মূজের মতো ব্যবহার করতে পারে। এটি অভ্যন্তরীণভাবে মোড়ানো () ব্যবহার করে এবং মোড়কের হ্যান্ডলারটি ফেরত দেয়, তাই মূলটিকে পুনরায় () পুনরায় সঞ্চয় করা সহজ।

মডিউলটি এভাবে প্রয়োগ করে 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এর চারপাশে সাবরোটিন মোড়কের মতো কিছুই নয়।
— ugexe

@ ইউজেক্সে একই পার্থক্য। পদ্ধতিগুলি রুটিনগুলি হয়, যেমনটি আমি সম্পাদনার পরে বলেছিলাম said
— jjmerelo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.