[Viana-pm] uso de prototypes nas funções/subrotinas em Perl
Eduardo Marques
sacorb at sapo.pt
Thu Dec 21 02:25:32 PST 2006
João Ferreira wrote:
> Olá a todos,
>
> tenho andado a discutir com alguns colegas o seguinte: o que é que se
> ganha/perde em usar prototypes nas funções de Perl ??
>
> qq coisa do tipo:
>
> sub soma($$) {
> my ($a,$b)=@_;
> return $a+$b;
> }
>
> ...
>
> my $resultado=soma(2,3);
>
> 1 - um possivel interesse seria verificar a quantidade de argumentos
> em pré-runtime ???
>
> 2 - por outro lado tornaria o código mais legível (ou talvez não)....
>
> 3 - no entanto não vejo a declaração dos arguimentos em lado nenhum...
> pelos vistos ninguém usa aquilo.. ?!?!
>
> alguém tem um ponto de vista sobre isto???
>
> Cumprimentos a todos
> Obrigado
>
O Damian Conway tem. :)
Do livro "Perl Best Practices":
> Prototypes:
> _Don't use subroutine prototypes_
O protótipo faz com que não seja possível deduzir o comportamento da
função olhando para a chamada, nem o contexto em que os argumentos vão
ser avaliados. Porque o que o protótipo faz é dizer ao perl qual o
contexto em que o argumento vai ser avaliado. Se o protótipo for func
($), isso não significa que o primeiro argumento é um escalar, significa
que se se passar uma lista como primeiro argumento, ela é avaliada em
contexto escalar.
No caso sub soma ($$) {} até nem é muito mau, se alguem tiver um
@numeros = (4, 3); e chamar soma(@numeros), sem o protótipo a coisa
funciona, mas com o protótipo, o perl avalia @numeros em contextos
escalar para o primeiro argumento, ($a = 2), não tem um segundo
argumento e estoura. Mas e se soma tem um terceiro argumento, @, com um
grupo de parametros qualquer que influencia o resultado (por exemplo, a
base com que o resultado é devolvido). Ao chamar soma(@numeros,
'octal'), o perl decide que $a = 2, $b = 0, @args =(), e devolve $a +
$b. 2. O que não era exactamente o comportamento esperado, nem pela
pessoa que usa a função, nem (provavelmente) pelo programador.
Outro problema da prototipagem é ser inútil quando se passa para
programação OO. A chamada de métodos ignora o protótipo.
More information about the Viana-pm
mailing list