2016-05-24 11 views
8

sqrt समारोह वाक्य रचना के माध्यम से कहा जा सकता है:एक सबरूटीन विधि वाक्य रचना के माध्यम से कहा जा सकता है कि परिभाषित

> sqrt 16 
4 

यह भी विधि वाक्य रचना के माध्यम से कहा जा सकता है:

> 16.sqrt 
4 

वहाँ बनाने के लिए एक रास्ता है प्रयोक्ता परिभाषित subroutines विधि वाक्यविन्यास के माध्यम से invokable?

उदाहरण के लिए, sq को परिभाषित करते हैं:

> sub sq(Int $n) { $n*$n } 
sub sq (Int $n) { #`(Sub|64042864) ... } 
> sq 4 
16 

वहाँ यह एक विधि के रूप प्रतिदेय बनाने के लिए एक तरीका है? अर्थात।

> 4.sq 

उत्तर

9

वहाँ उपयोगकर्ता परिभाषित सबरूटीन्स विधि वाक्य रचना के माध्यम से invokable बनाने के लिए एक तरीका है?

हाँ, बस के रूप में .& सिंटैक्स का उपयोग करें,:

625.&sqrt.say 
# 25 

invocant पहले तर्क के रूप में पारित हो जाता है:

sub sq { $^a² }; say 4.&sq 
4.&sq.say 
# 16 

केवल पकड़ आप है अगर unspace उपयोग करने के लिए आप इन्हें कई पंक्तियों पर विधि श्रृंखला को तोड़ना चाहते हैं:

4.&sq\ 
.&sq.say; 
+0

धन्यवाद जैफिक्स! – dharmatech

+1

'125. और sqrt.say' को सही उत्तर देने के लिए' 625. और sqrt.say' होना चाहिए? – Bugfinger

4

आप Int बढ़ाने के लिए बंदर-लेखन का उपयोग कर सकते हैं। ऑप्टिमाइज़र को जमानत के लिए उम्मीद करें, आपकी इच्छा/स्तन कम करने के लिए और दुनिया सामान्य रूप से समाप्त हो। बंदर-टाइपिंग बुराई है। इसका उपयोग तब तक न करें जब तक आपको करना न पड़े।

use MONKEY-TYPING; 
augment class Int { method sq(Int:D $i:){ $i * $i } }; 
my Int $i = 4; 
say $i.sq; 

आप ऑब्जेक्ट में भूमिका निभा सकते हैं। ध्यान दें कि वस्तु वस्तु है, कक्षा Int और न ही कंटेनर $i

my $i = 4 but role :: { method sq(Int:D $i:){ $i * $i } }; 
say $i.sq; 

आप एक नि: शुल्क चल विधि बना सकते हैं और .& विधि कॉल ऑपरेटर का उपयोग कर सकते हैं।

my method sq(Int:D $i:){ $i * $i }; 
my $i = 4; 
say $i.&sq; 

संपादित करें:

तुम सच में मान्यताओं को तोड़ने के लिए आप यहां तक ​​कि निजी विशेषताओं का उपयोग कर सकते हैं।

class Foo { has $!bar = 'meow'; }; 
use MONKEY-TYPING; 
augment class Foo { method baz { say $!bar } }; 
Foo.new.baz 
# OUTPUT«meow␤» 
+0

धन्यवाद gfldex! मुझे आश्चर्य है कि यह अच्छी तरह से समर्थित प्रतीत नहीं होता है। – dharmatech

+0

@darmatech अगर यह अच्छी तरह से समर्थित नहीं लगता है तो आपका समाधान आपके पास होने वाली समस्या के अनुरूप नहीं हो सकता है। जब तक आप विवरण प्रदान नहीं करते हैं कि आप बाहर से कक्षा में कोई विधि क्यों जोड़ना चाहते हैं, कोई भी आपको अच्छी सलाह नहीं दे सकता है। पर्ल 6 precompiled मॉड्यूल का उपयोग कर रहा है। यदि आप इस तरह के मॉड्यूल द्वारा उपयोग की जाने वाली कक्षा को बढ़ाते हैं तो संकलक को उस मॉड्यूल को फिर से कंपाइल करना पड़ सकता है, जो धीमेपन की एक लंबी श्रृंखला को ट्रिगर कर सकता है। पर्ल 6 का अर्थ तेजी से बाइटकोड को नाइट करने के लिए पर्याप्त रस्सी के साथ एक कंपाइलर प्रदान करना है। यह एक कीमत पर आता है। –

+0

मैं यह जोड़ना चाहता हूं कि 'आयु वर्ग' उदाहरण उदाहरण के उस वर्ग के निजी विशेषताओं तक पहुंच की अनुमति देता है, जबकि अन्य सभी उदाहरण नहीं हैं। –

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