2017-05-05 6 views
5

यह मेरे पिछले एक Why is Perl 6's unwrap method a method of Routine? से एक सतत प्रश्न है, लेकिन अधिकतर असंबद्ध है।मैं रूटिन :: लपेटें पर मेटा विधियों को क्यों नहीं कॉल कर सकता हूं?

wrap विधि "एक निजी वर्ग WrapHandle कहा जाता है का एक उदाहरण वापस जाने के लिए दस्तावेज है कि एक वर्ग जो निजी हो लीक करने के लिए अजीब होने के अलावा, यह वास्तव में बात यह है कि वापस आ जाता है के नाम पर नहीं है वर्ग वास्तव में Routine::WrapHandle है।।: ।

$ perl6 
> sub f() { say 'f was called' } 
sub f() { #`(Sub|140397740886648) ... } 
> my $wrap-handle = &f.wrap({ say 'before'; callsame; say 'after' }); 
Routine::WrapHandle.new 

लेकिन यहाँ सवाल है मैं Routine::WrapHandle पर .^methods कॉल करने के लिए चाहते थे कि काम नहीं करता है:।

> Routine::WrapHandle.^methods 
Could not find symbol '&WrapHandle' 
    in block <unit> at <unknown file> line 1 

यह वही है एक अपरिभाषित ग पर यह कोशिश कर के रूप में लड़की का नाम:

> $wrap-handle.^methods 
(restore) 
> $wrap-handle.^name 
Routine::WrapHandle 

वहाँ पर क्या हो रहा है:

> Foo::Baz.^methods 
Could not find symbol '&Baz' 
    in block <unit> at <unknown file> line 1 

मैं उदाहरण हालांकि पर मेटा तरीकों कॉल कर सकते हैं?

+1

यह एक [लेक्सिकल क्लास] है (https://github.com/rakudo/rakudo/search?&q=WrapHandle&type=) –

उत्तर

6

Routine::WrapHandle की परिभाषा कुछ इस तरह दिखता है:

my class Routine { 
    method wrap(&wrapper) { 
     my class WrapHandle { ... } 
     ... 
    } 
} 

हम आसपास के विधि अनदेखा कर सकते हैं; महत्वपूर्ण बात यह है कि हम एक बाहरी वर्ग के भीतर परिभाषित एक व्याख्यात्मक आंतरिक वर्ग से निपट रहे हैं। (अंतर्निहित our के बजाय)

package Foo { 
    my class Bar {} 
    say Bar.^name; #=> Foo::Bar 
} 

say try Foo::Bar; #=> Nil 

भीतरी वर्ग की पूरी तरह से योग्य नाम संलग्न पैकेज का नाम शामिल होगा, लेकिन कारण स्पष्ट my,: कुछ और सरल बनाना, हम निम्नलिखित पैटर्न पर पहुंचने कक्षा पैकेज चर के रूप में स्थापित नहीं की जाएगी और फ़ाइल स्कोप पर लुकअप विफल हो जाता है।

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