Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos

Comunidade

r2 - 07 Mar 2006 - IgorSutton


NOME

fields - pragma para criar atributos de classe em tempo de compilação

voltar para o topo


SINOPSE

  {
      package Foo;
      use fields qw(foo bar _Foo_private);
      sub new {
          my Foo $self = shift;
          unless (ref $self) {
              $self = fields::new($self);
              $self->{_Foo_private} = "this is Foo's secret";
          }
          $self->{foo} = 10;
          $self->{bar} = 20;
          return $self;
      }
  }
  my $var = Foo->new;
  $var->{foo} = 42;
  # this will generate an error
  $var->{zap} = 42;
  # subclassing
  {
      package Bar;
      use base 'Foo';
      use fields qw(baz _Bar_private);  # não é compartilhado com Foo
      sub new {
          my $class = shift;
          my $self = fields::new($class);
          # inicializa os atributos das classes base
          $self->SUPER::new();
          # inicializa os próprios atributos
          $self->{baz} = 10;
          $self->{_Bar_private} = "this is Bar's secret";
          return $self;
      }
  }

voltar para o topo


DESCRIÇÃO

O pragma fields ativa atributos de classe verificados em tempo de compilação. NOTA: A implementação atual mantém os atributos declarados no hash %FIELDS do pacote que o executou, que pode mudar em versões futuras. Não atualize o hash %FIELDS diretamente, pois ele deve ser criado em tempo de compilação para ser utilizado completamente, como é feito por este pragma. Válido apenas para Perl posteriores a 5.9.0: Se uma referência à uma variável tipada lexicamente é utilizada para acesso a um elemento hash e um pacote com o mesmo nome do tipo declarou atributos de classe com este pragma, então a operação é transformada em um acesso de array em tempo de compilação. O pragma relacionado base irá combinar os atributos das classes bases e quaisquer outros atributos utilizando o pragma fields. Isto garante que a herança de atributos funcionará corretamente. Os nomes de atributos que iniciam com o caracter _ são privados para a classe que os criou e não são visíveis para as classes filhas. Atributos herdados podem ser sobrescritos porém irão gerar um aviso (warning) caso utilizados com a opção de linha de comando <-w>. Válido apenas para versões Perl anteriores à 5.9.0: Este pragma permite que você tenha objetos com atributos compactos e acesso tão rápido quanto um array. Isto apenas funciona enquanto os objetos são acessados através de variáveis tipadas corretamente. Caso os objetos não sejam tipados, o acesso apenas é verificados em tempo de execução. As seguintes funções são suportadas:

new
Perl anterior a 5.9.0: fields::new() cria e abençoa (bless) um pseudo-hash composto os atributos declarados utilizando o pragma fields na classe especificada.
Perl 5.9.0 ou atual: fields::new() cria e abençoa (bless) um hash restrito composto dos atributos declarados utilizando o pragma fields na classe especificada.
Esta função é utilizável com ou sem pseudo-hashes. Ela é a maneira recomendada para construir um objeto baseado no pragma fields.
Isto torna possível escrever um construtor como este:
    package Critter::Sounds;
    use fields qw(cat dog bird);
    sub new {
        my $self = shift;
        $self = fields::new($self) unless ref $self;
        $self->{cat} = 'meow';                          # scalar element
        @$self{'dog','bird'} = ('bark','tweet');        # slice
        return $self;
    }

phash
Versão de Perl anterior a 5.9.0:
A função fields::phash() pode ser utilizado para criar e inicializar um pseudo-hash não abençoado (unblessed). Esta função deve sempre ser utilizada ao invés de criar diretamente um pseud-hash.
Caso o primeiro argumento seja uma referência para um array, o pseudo-hash irá ser criado com as chaves deste array. Caso um segundo argumento seja fornecido, ele deverá ser uma referência para um array cujo seus elementos serão usados como valores. Caso o segundo array contenha menos elementos que o primeiro, os elementos excedentes do pseudo-hash não serão inicializados. Isto torna particularmente útil a criação de um pseudo-hash de argumentos de uma função:
    sub dogtag {
       my $tag = fields::phash([qw(name rank ser_num)], [@_]);
    }
A função fields::phash() também aceita uma lista de pares de chave/valor que serão usadas para construir o pseudo-hash. Por exemplo:
    my $tag = fields::phash(name => "Joe",
                            rank => "captain",
                            ser_num => 42);
    my $pseudohash = fields::phash(%args);
Perl versão 5.9.0 e atuais:
Os pseudo-hashes foram removidos do Perl, na versão 5.10. Considere a utilização de hashes restritos ou fields::new(). A utilização de fields::phash() causará um erro.

voltar para o topo


VEJA TAMBÉM

the base manpage

voltar para o topo


TRADUÇÃO

Igor Sutton <igor@izut.com>

voltar para o topo