SORU
12 HAZİRAN 2009, Cuma


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
12 HAZİRAN 2009, Cuma


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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobono1baby

    bobono1baby

    14 AĞUSTOS 2011
  • Canceriansoul

    Canceriansou

    15 Ocak 2011
  • whatever

    whatever

    30 EYLÜL 2005