For-in

Adam Boduch

For-in - pętla języka Delphi

Nowością w Delphi 2005 jest nowa wersja pętli For, która umożliwia operowanie na zbiorach, tablicach czy ciągach znakowych. Odpowiednikiem pętli for-in w innych językach programowania jest pętla foreach (np. w PHP). Przykładowo, chcielibyśmy przeanalizować, przeszukać każdy element tablicy. Możemy w tym celu skorzystać ze zwykłej pętli for:

program Loop_app;

{$APPTYPE CONSOLE}

uses SysUtils;

var
  I : Integer;

const
  A : array[1..10] of String = ('Jeden', 'Dwa', 'Trzy', 'Cztery',
  'Pięć', 'Sześć', 'Siedem', 'Osiem', 'Dziewięć', 'Dziesięć');

begin
  for I := Low(A) to High(A) do
  begin
     Writeln(IntToStr(i) + ': ' + A[i]);
  end;

  Readln;
end.

W programie użyłem wcześniej omówionych konstrukcji, czyli pętli For oraz tablicy deklarowanej jako stała. Zobaczmy teraz, w jaki sposób można napisać tak samo działający program z użyciem składni for-in:

program Loop_app;

{$APPTYPE CONSOLE}

uses SysUtils;

var
  S : String;

const
  A : array[1..10] of String = ('Jeden', 'Dwa', 'Trzy', 'Cztery',
  'Pięć', 'Sześć', 'Siedem', 'Osiem', 'Dziewięć', 'Dziesięć');

begin
  for S in A do
  begin
    Writeln(S);
  end;

  Readln;
end.

Składnia for-in posiada prostą konstrukcję. Najpierw podaje się nazwę zmiennej, do której zostanie przypisany aktualny element zbioru lub tablicy. Po słowie kluczowym In należy umieścić nazwę tablicy/zbioru. Wydaje mi się że taka konstrukcja jest czytelniejsza.

Przy użyciu pętli for mamy możliwość odczytania wartości zmiennej I, która określa numer iteracji. Takie rozwiązanie możemy także wprowadzić w naszym przykładzie, deklarując dodatkową zmienną I:

begin
  I := 1;

  for S in A do
  begin
    Writeln(IntToStr(i) + ': ' + S);

    Inc(i);
  end;

  Readln;
end.

Konstrukcja for-in w połączeniu z łańcuchami

Konstrukcja for-in może być wykorzystywana wraz z tablicami (co zaprezentowałem w poprzednich przykładach) oraz zbiorach czy ciągach znakowych String. Do każdego znaku ciągu można odwołać się podając numer indeksu w nawiasie kwadratowym, podobnie jak odwołujemy się do elementu tablicy. Czyli np. do pierwszego znaku ciągu można odwołać się w ten sposób:

  S := 'Delphi';
  Writeln(S[1]); // wyświetlona litera: D

Operacji na poszczególnych znakach ciągu S można dokonać za pomocą konstrukcji for-in:

program Loop_app;

{$APPTYPE CONSOLE}

uses SysUtils;

var
  S : String;
  C : Char;

begin
  Write('Wpisz tekst: ');
  Readln(S);

  Writeln('---');

  for C in S do
  begin
    Writeln(C);
    Sleep(1000);
  end;
end.

Ten prosty program w pętli wyświetla każdy znak ciągu znakowego S, jeden pod drugim w odstępach sekundowych.

Zobacz też:

5 komentarzy

Czy istnieje jakaś zasadnicza różnica pomiędzy pętlą 'for' a pętlą 'for-in', poza pewną wygodą tej ostatniej w pewnych przypadkach?

Czyli stosujemy tę pętle w tedy, gdy wartość elementu zbioru/tablicy jest ważniejsza od jej indexu...

a.. bo ja patrzyłem na linki z głównej i for-in było nad while a linki różne.. ok

Eee, poprzez For-in tez jest dostep :) Po prostu umieszczona zostala w 2 kategoriach.

Czemu ta pętla jest głęboko w Delphi/../../.. a np. While w od razu w Delphi/ ?