[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