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


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.