2017-07-11 20 views
5

मैं आईओ :: कैसे संभाल सकता हूं? उदाहरण के लिए, मैं हर say के बाद फ्लश फोन करके "autoflush" करने के लिए सक्षम होना चाहते हैं:मैं पर्ल 6 के आईओ :: हैंडल कैसे कर सकता हूं?

class MyIO is IO::Handle { 
    multi method say(MyIO:D: **@text --> True) { 
     nextsame; 
     $*ERR.say: "Flushing\n"; 
     self.flush; 
     } 
    }; 

Metamodel::Primitives.rebless: $*OUT, MyIO; 
put $*OUT.^name; 

$*OUT.say: "This is standard out"; 

लेकिन, ऐसा लगता है कि MyIO कभी नहीं कहा जाता है।

मुझे लगता है कि मैं प्रभाव उत्पन्न करने के लिए कह सकता हूं, लेकिन मुझे कुछ व्यवहार को ओवरराइड करने के लिए सरल उप-वर्गों की तकनीक में अधिक रुचि है। लेकिन, यह कहकर कि, यदि एक और अधिक 6 तरीके है कि डिजाइन लोगों के उपयोग के लिए इरादा रखता है।

तो, कुछ सवाल:

  • करता पर्ल 6 actaully देखभाल मैं इसे reblessed? यह विधि नामों को कैसे देखता है जो इसे छोड़ सकता है?

  • बिल्टिन कक्षाएं विशेष रूप से मानक ओओ तकनीकों के प्रति प्रतिरोधी हैं क्योंकि उनकी जादूगर और एनक्यूपीनेस?

  • क्या पर्ल 6 हैंडल के साथ निम्न स्तर की झुकाव को हतोत्साहित करता है, जैसे फाइल डिस्क्रिप्टर पर $ * को फिर से खोलना? (Does changing Perl 6's $*OUT change standard output for child processes? में के रूप में)

+0

भविष्य में भविष्यवाणी की भविष्यवाणी: 6. डी भाषा में आईओ पर विशिष्ट विधियां होंगी :: हैंडल आप अपने सबक्लास में * सभी * लिखने/पढ़ने को प्रभावित करने के लिए ओवरराइड कर सकते हैं। मौजूदा कामकाजी नाम '.write-internal', '.read-internal', और' .eof-internal 'हैं, हालांकि नाम अभी तक बाइकहेड और specced नहीं हैं। [वर्तमान प्रत्यारोपण में उनके उपयोग का एक पूर्वावलोकन देखा जा सकता है। आईओ :: पाइप] (https: // github।com/rakudo/rakudo/blob/58900e7ba8ad31d905968d950bd9066a239320f5/src/core/IO/Pipe.pm # L25-L51) –

+2

यह भी ध्यान दें कि ['nextsame' कॉलर पर वापस नहीं लौटता है] (https://rakudo.party/ पोस्ट/Perl6-लेकिन-यहाँ-मेरे-डिस्पैच-तो-Callwith-शायद)। –

+1

यदि आप '.perl.say $ * OUT^^ find_method (" say ") चलाते हैं। उम्मीदवारों का आप देख सकते हैं कि आपका उम्मीदवार वास्तव में दिखाता है। यह सिर्फ इतना विशिष्ट नहीं है, यानी '$ text' उम्मीदवार आपके' ** @ args' उम्मीदवार से जीतते हैं। – timotimo

उत्तर

10

Reblessing sooo 90 :-)

है क्यों नहीं भूमिका रचना का उपयोग अपने लक्ष्य को प्राप्त करने के लिए?

role MyWay { 
    method say(|) { 
     note "whee"; 
     nextsame 
    } 
} 
my $*OUT = PROCESS::<$OUT> but MyWay; 
$*OUT.say("foo") # whee\nfoo 

यह मूलतः बनाता है एक नया गतिशील $*OUT मौजूदा $*OUT पर लेकिन एक नई पद्धति say में मिलाया साथ

के रूप में मैं कर सकते हैं और साथ ही आपके सवालों के जवाब के लिए आधारित:।

  • reblessing है कुछ आंतरिक माना जाता है कि आप संभवतः
  • नहीं करना चाहते हैं, बहुत से निर्मित वर्गों को ऑब्जेक्ट बनाने के मानक तरीके का उपयोग न करके गति के लिए अनुकूलित किया जाता है। इस तरह से उन्हें उपclass करना मुश्किल हो जाता है। कुछ मामलों में, विशेष कोड ऑब्जेक्ट्स बनाने के मानक तरीके से वापस आ जाता है, जिससे इन वर्गों को सबके बाद सबक्सासेबल बना दिया जाता है (जैसे Date)।
  • आम तौर पर मैं कहूंगा कि निम्न स्तर की झुकाव की सलाह नहीं दी जाती है क्योंकि चीजें तेजी से बनाने के लिए अभी भी आंतरिक रिफैक्टर चल रहे हैं, जो आपके कोड को तोड़ सकते हैं यदि आप बहुत कम झुका रहे हैं।

के बाद से say आंतरिक print का उपयोग करता है, यह बेहतर होगा वास्तव में अपने खुद print विधि में मिश्रण करने के लिए:

role MyWay { 
    method print(|) { 
     note "whee"; 
     nextsame 
    } 
} 
my $*OUT = PROCESS::<$OUT> but MyWay; 
say "foo"; # whee\nfoo 

यह है नहीं रह गया है say एक विधि के रूप कॉल करने के लिए की आवश्यकता होगी, के अतिरिक्त लाभ है, क्योंकि say का उप संस्करण गतिशील रूप से $*OUT बदल जाएगा।

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

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