[SP-pm] Variavel somente leitura
Solli Honorio
shonorio em gmail.com
Segunda Abril 28 08:23:47 PDT 2008
O detalhe é como vc 'ativa' e 'desativa' a alteração da variável. Eu pensei
em algo como a criação de um objeto e aí vc controlaria no 'setter' (talvez
via o caller) quem poderia alterar ou não.
Mas mesmo assim isto parece meio estranho, pois a minha dúvida com relação a
este problema é se vc não quer que alguém externo as tuas rotinas façam esta
alteração, ou se é as tuas rotinas mesmo (o que não faz o menor sentido pra
mim, já que neste contexto vc está programando e pode definir que tipo de
ação cada rotina executará).
Solli M. Honório
2008/4/28 Lucas Mateus <lucasmateus.oliveira em gmail.com>:
> Achei esse barato aki, o que acham ?
>
> my $host = 'localhost';
>
> Internals::SvREADONLY($host => 1); # lock $host
> print eval { $host = '10.1.1.1' } ? "O valor de \$host foi alterado\n" :
> "O valor de \$host nao pode ser alterado\n";
>
> Internals::SvREADONLY($host => 0); # unlock $host
> print eval { $host = '10.1.1.1' } ? "O valor de \$host foi alterado\n" :
> "O valor de \$host nao pode ser alterado\n";
>
>
>
>
> 2008/4/28 Luis Motta Campos <luismottacampos em yahoo.co.uk>:
>
> Lucas Mateus wrote:
>> > ## Variavel Global
>> > my $host = 'localhost';
>> >
>> > &func_01;
>> > &func_02;
>> > &func_03;
>> >
>> > sub func_01 {
>> > # aqui não posso sobrescrever $host
>> > }
>> >
>> > sub func_02 {
>> > # aqui não posso sobrescrever $host
>> > }
>> >
>> > sub func_03 {
>> > # aqui eu devo sobrescrever $host
>> > }
>> >
>> >
>> > Conforme o exemplo acima, tenho uma váriavel que não pode ser alterada
>> > exceto por uma função. Como garantir que isso aconteça, ja que para esse
>> > caso não posso utilizar *"use constant"* ?
>>
>> O que você está procurando são closures.
>>
>> {
>> my $host;
>>
>> sub set_host {
>> $host = shift;
>> }
>>
>> sub get_host {
>> return $host;
>> }
>> }
>>
>> sub pode_ler_host {
>> # recupera a função que dá acesso ao valor de host
>> my $host_accessor = shift;
>> my $host = $host_accessor->(); # pega $host
>> # usa $host
>> }
>>
>> sub pode_escrever_host {
>> my $host_accessor = shift;
>> my $host = 'localhost';
>> $host_accessor->( $host );
>> }
>>
>> sub pode_ler_e_escrever_host {
>> my ( $host_getter, $host_setter ) = @_;
>> # pega host:
>> my $host = $host_getter->();
>> $host =~ s/o/a/g; # altera
>> $host_setter->( $host );
>> }
>>
>> E aí, pode passar os métodos que acha que o cara pode usar:
>>
>> pode_ler_host( \&get_host );
>> pode_escrever_host( \&set_host );
>> pode_ler_e_escrever_host( \&get_host, \&set_host );
>>
>> Isso, mais pacotes (para você poder importar os métodos dentro dos
>> pacotes das pessoas que querem ler das tuas variáveis) é o que você pode
>> disponibilizar como interface.
>>
>> Lembre-se de que isso não é segurança, é apenas separação.
>>
>> Se você quer segurança, precisa do Safe::World, e restringir que
>> bytecodes os programas que você vai rodar podem ou não podem usar.
>>
>> Espero que isso te ajude.
>> Putamplexos!
>> --
>> Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
>> Perl fanatic evangelist, and amateur {cook, photographer}
>>
>> _______________________________________________
>> SaoPaulo-pm mailing list
>> SaoPaulo-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
--
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080428/400ddb63/attachment.html
Mais detalhes sobre a lista de discussão SaoPaulo-pm