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ż:
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/ ?