Anonymous Methods no Delphi 2009
Um dos novos recursos no Delphi 2009 é anonymous methods. É também chamado de “referências a métodos”, pois a declaração de um tipo procedural é feita com a sintaxe “reference to function/procedure”:
type TComparaString = reference to function(const S1, S2: string): Integer;
Esse tipo pode ser usado como qualquer outro tipo procedural:
procedure TLista.Ordena(Compara: TComparaString);
var
i, j: Integer;
begin
for i := 0 to FItems.Count - 2 do
for j := FItems.Count - 1 downto i + 1 do
if Compara(FItems[j], FItems[i]) < 0 then
Troca(i, j);
end;
(Perdoem-me o Bubble Sort)
Não precisamos mais declarar um método separadamente para cada forma diferente de ordenação que for necessária. O código abaixo ordena uma lista alfabeticamente, depois de forma inversa, e finalmente de acordo com o tamanho da string:
Lista := TLista.Create;
try
Lista.Adiciona('Um');
Lista.Adiciona('Dois');
Lista.Adiciona('Tres');
Lista.Adiciona('Quatro');
Lista.Adiciona('Cinco');
Lista.Ordena(function(const S1, S2: string): Integer
begin
Result := CompareStr(S1, S2);
end);
WriteLn(Lista.Texto);
Lista.Ordena(function(const S1, S2: string): Integer
begin
Result := CompareStr(S2, S1);
end);
WriteLn(Lista.Texto);
Lista.Ordena(function(const S1, S2: string): Integer
begin
Result := Length(S1) - Length(S2);
if Result = 0 then
Result := CompareStr(S1, S2);
end);
WriteLn(Lista.Texto);
finally
Lista.Free;
end;
A resultado do programa é:
Cinco Dois Quatro Tres Um Um Tres Quatro Dois Cinco Um Dois Tres Cinco Quatro
Até aí, o recurso não é nada demais – permite economizar algumas linhas em troca de uma sintaxe discutivelmente mais confusa. Ele fica realmente interessante quando se nota que é, de fato, uma Closure, que exploraremos no próximo artigo.
Em 29 de agosto de 2008 às 01:54
[...] Anonymous Methods no Delphi 2009 [...]