Anonymous Methods no Delphi 2009

Escrito em 28 de agosto de 2008 em Linguagem Delphi por Leonel Togniolli

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.


Um comentário em 'Anonymous Methods no Delphi 2009' »

Assine os comentários usando RSS ou faça um TrackBack para 'Anonymous Methods no Delphi 2009'.

Em 29 de agosto de 2008 às 01:54

[...] Anonymous Methods no Delphi 2009 [...]