Zastosowanie "in" w pętli for

0

Jakie istnieją zastosowania słówka in w pętli for ?

0

Na SO piją, ale w googlu nie

https://www.google.com/search?q=pascal+loop+in

2
neytro napisał(a):

Jakie istnieją zastosowania słówka in w pętli for ?

Pytasz o pętlę for in do czy o słowo kluczowe in wykorzystane w ciele pętli?

Jeżeli o pętlę, to jest to skrócony zapis iteracji po "kontenerze danych".
Gdzie kontenerem może być np. string, set, tablica, lista, kolekcja, itd.
A skrócony dlatego, że nie wymaga deklaracji zmiennej dla licznika pętli.

Weźmy taki "standardowy" kod;

var
  lST : TStringList;
  I : integer;
begin
  lST := TStringList.Create;
  try
    lST.Add('a');
    lST.Add('b');
    lST.Add('c');

    for i := 0 to lST.Count-1 do
       ShowMessage(lST[I]);
  finally
    lST.Free;
  end;  
end;

To samo można napisać tak:

var
  lST : TStringList;
  lItem : string;
begin
  lST := TStringList.Create;
  try
    lST.Add('a');
    lST.Add('b');
    lST.Add('c');

    for lItem in lST do
       ShowMessage(lItem);
  finally
    lST.Free;
  end;  
end;

To jest tzw. syntatic sugar, zapis jest prostszy i nie spowoduje ewentualnych pomyłek przy odwołaniu do wartości z kontenera z użyciem niewłaściwej wartości indeksu, ponieważ aktualną wartość masz zawsze w zmiennej lokalnej (lItem).

A zastosowanie jest jedno - iteracja po dowolnym kontenerze na dane.
O to chodziło?

3

Warto też zaznaczyć, że iterator w takiej pętli for in do to zwyczajna zmienna lokalna, więc przypisywanie czegokolwiek do niej nie spowoduje w magiczny sposób, że wartość wskoczy do kontenera, po którym iterujemy — a widziałem już takie próby. Przypisywanie ma jedynie prawo działać w przypadku, gdy iterator jest wskaźnikiem (czy to zwykłym, czy obiektem), a owe przypisania wykonuje się na zawartości spod wskaźnika lub na składowych obiektu.

0

Chodzi mi dokładnie o zastosowanie "for class/ interface in class/interface2". Spotkałem się z tym ale nie rozumiem tego.

2

Jeśli chodzi o for X in Instance do, to jest to iteracja po czymś (np. klasie) co implementuje iterator i jest ”iterowalne” — w praktyce sprowadza się to do implementacji w danej klasie zawartości interfejsów IEnumerator i IEnumerable. To jest w sumie jedna właściwość i kilka metod, które służą m.in. do pobierania aktualnego elementu czy przechodzenia do kolejnego.

Jednak to, że dana klasa może być enumerowana, wcale nie oznacza, że musi być kolekcją (czyli zawierać zestaw danych takiego samego typu). W końcu to jak zaimplementuje się metody z interfejsów jest kwestią dowolną, a liczy się jedynie tyle, aby zaimplementować wszystkie składowe ww. interfejsów. Metody te można implementować w dowolnej sekcji klasy — w końcu implementacja interfejsu wymusza ich użycie, ale nie nakazuje konkretnej widoczności.

1 użytkowników online, w tym zalogowanych: 0, gości: 1