[SP-pm] Duvida primaria

Nilson Santos Figueiredo Jr. acid06 at gmail.com
Thu Oct 21 05:48:07 PDT 2010


2010/10/21 russoz at gmail.com <russoz at gmail.com>:
> Similarmente, a inicialização das tabelas de lookup/dispatch (qualquer
> flavour) NÃO fazem parte do bloco de código.
> Ou, falando de outra forma: sim, você está certo, faz diferença em diversos
> casos. But then again, se você escolhe um caso mal-codificado com dispatch e
> compara com um bem-codificado com given/when, não é exatamente algo muito
> justo, é? :-)

Não é questão de mal ou bem codificado, é uma questão de necessidade.

Sempre que você precise, por algum motivo, executar algum de N casos
de código em que o código em si depende do escopo atual, você não
poderia declarar a dispatch table de fora. Por exemplo, você está
escrevendo uma função que retorna funções que usa variáveis do escopo
local no closure.

Exemplo esdrúxulo mas que talvez ilustre o tipo de caso de uso que
estou falando:

<code>

sub tag_generator {
    my ($tag_name, $style) = @_;
    given ($style) {
        when ('html') {
            return sub {
                my $content = shift // '';
                "<$tag_name>$content</$tag_name>"
            }
        }
        when ('xml')  {
            return sub {
                my $content = shift // '';
                "<$tag_name" . ( length $content ?
">$content</$tag_name>" : "/>" )
            }
        }
    }
}

my $tag_html = tag_generator('tag', 'html');
my $tag_xml  = tag_generator('tag', 'xml');

print $tag_html->("");
print $tag_xml->("");

</code>

-Nilson


More information about the SaoPaulo-pm mailing list