2017-05-05 19 views
5

Bu, bir öncekimden Why is Perl 6's unwrap method a method of Routine?, ancak çoğunlukla ilgisiz bir soru.Neden Routine :: WrapHandle'da meta yöntemlerini arayamıyorum?

wrap yöntemi "WrapHandle denilen özel sınıfının bir örneğini döndürmek için belgelenmiş olduğunu özeldir bir sınıf sızdırmakla tuhaf olmasının yanı sıra, geri geliyor şeyin adı aslında değil sınıf aslında Routine::WrapHandle olduğunu..: .

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

Ama burada bir soru ben Routine::WrapHandle üzerinde .^methods aramak istedim Yani çalışmaz.

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

Bu aynı tanımlanmamış bir c üzerinde çalışmak gibi lass isim:

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

orada neler oluyor:

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

olsa örneğinde meta yöntemleri çağırabilir?

+1

Bu bir [sözcük sınıfı] (https://github.com/rakudo/rakudo/search?&q=WrapHandle&type=) –

cevap

6

Routine::WrapHandle tanımı şöyle görünür:

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

Biz çevreleyen yöntemi göz ardı edebilirsiniz; önemli olan, bir dış sınıfta tanımlanan sözcüksel içsel sınıfla uğraşmamızdır. (Yerine örtülü our arasında) iç sınıfının tam nitelikli adını kapsayan paketin adı içerecektir

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

say try Foo::Bar; #=> Nil 

ama nedeniyle açık my: Biraz daha Basitleştirme, aşağıdaki desen varmak sınıf bir paket değişkeni olarak yüklenmez ve dosya kapsamındaki arama başarısız olur.

İlgili konular