Nasıl Perl yöntem öznitelikleri çalışır?
Bir az bilinen yerleşik Perl özelliktir bağlıyor. Ancak, documentation resmi oldukça kötü bir iş kavramına yeni başlayanlar tanıtımı yapıyor. Aynı zamanda, Katalizör kullanmak gibi çerçeveler çok kolay şeyler var gibi görünüyor hangi kapsamlı bir şekilde bağlıyor. Sonuçlarını bilmeden bir şey kullanarak biraz berbat beri, detayları bilmek isterim. Sözdizimi-bilge Python'un dekoratörler gibi görünüyorlar, ama belgelere daha basit bir şey anlamına gelir.
İyi ve kapılar ardında ne (mümkünse gerçek dünya örnekleri ile açıklar mısınız?
CEVAP
Haklısın, belgelere, özellikle de nitelikleri çok karmaşık değildir, çünkü bu alanda çok net değil. Eğer bir yordam tanımla özniteliği varsa, bu gibi:
sub some_method :Foo { }
Perlprogramınızı derlerken(bu çok önemli) mevcut paketi 5* *sihirli alt veya üst sınıflar için herhangi bir bak. Bu geçerli bir paket adı ile, kendi alt için bir referans olarak adlandırılacak ve öznitelikleri Listesi Bu yordam için tanımlanan. Eğer bu işleyicisi yoksa, derleme başarısız olur.
Bu işleyici yapacağın tamamen sana kalmış. Evet, bu doğru. Hiçbir gizli büyü. Eğer hata bildirmek istiyorsanız, soruna neden olan bir öznitelik adı dönen derleme bir "nitelik" mesajı. geçersiz başarısız olmasına neden olur
Birisi diyor zaman adlı başka bir işleyici FETCH_CODE_ATTRIBUTES
denir
use attributes;
my @attrs = attributes::get(\&some_method);
Bu işleyici paket adı ve yordam referans geçirildi ve alt öznitelikleri listesini döndürmek gerekiyordu (ama gerçekten ne yine size kalmış).
Burada basit bir "" sonraki sorgu yapabilirsiniz hangi isteğe bağlı öznitelikleri ile: yöntemleri . etiketleme etkinleştirmek için bir örnektir
package MyClass;
use Scalar::Util qw( refaddr );
my %attrs; # package variable to store attribute lists by coderef address
sub MODIFY_CODE_ATTRIBUTES {
my ($package, $subref, @attrs) = @_;
$attrs{ refaddr $subref } = \@attrs;
return;
}
sub FETCH_CODE_ATTRIBUTES {
my ($package, $subref) = @_;
my $attrs = $attrs{ refaddr $subref };
return @$attrs;
}
1;
Şimdi, Sınıfım ve tüm alt sınıflarını, isteğe bağlı öznitelikleri kullanın ve onları attributes::get()
kullanarak sorgulayabilirsiniz:
package SomeClass;
use base 'MyClass';
use attributes;
# set attributes
sub hello :Foo :Bar { }
# query attributes
print "hello() in SomeClass has attributes: ",
join ', ', attributes::get(SomeClass->can('hello'));
1;
__END__
hello() in SomeClass has attributes: Foo, Bar
Özetle, öznitelikleri yapma çok hangi diğer yandan yapar onları çok esnek: kullanım olarak gerçek "nitelikler" (bu örnekte gösterildiği gibi), uygulamak gibi bir şey dekoratörler (Sinan's answer), ya da için kendi sinsi amaçları.
JavaScript kilitler nasıl çalışır?...
CSS üçgenler nasıl çalışır?...
Veri bağlama Nasıl çalışır?AngularJS :...
Nasıl veritabanı indeksleme çalışır?...
Bit shift (bit-shift) operatörleri ned...