r2 - 07 Mar 2006 - IgorSutton
NOME
fields - pragma para criar atributos de classe em tempo de compilaçãoSINOPSE
{
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;
}
}
DESCRIÇÃO
O pragmafields 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
fieldsna 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
fieldsna 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 defields::phash()causará um erro.
