Het nadeel van nieuwe features is echter: je moet ze wel gebruiken :-). Heel gauw ben je geneigd om je oude gewoontes te blijven gebruiken: bijvoorbeeld nog steeds "for i := 0 to stringlist.Count-1 do" gebruiken in plaats van "for s in stringlist".
Ik had al eens een serie interessante blogs gelezen over "fun with enumerators":
http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators-part-1.html
http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators-part-2-multiple.html
http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators-part-3.html
http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators-part-4-external.html
http://17slon.com/blogs/gabr/2007/03/fun-with-enumerators-part-5-class.html
In feite komt het erop neer, dat elke class die een "public GetEnumerator" functie heeft, gebruikt kan worden voor een "for in" loop.
De GetEnumerator functie moet een class teruggeven met de volgende functies (als voorbeeld van TStringList.GetEnumerator):
TStringsEnumerator = classVan de volgende code...:
public
function GetCurrent: string;
function MoveNext: Boolean;
property Current: string read GetCurrent;
end;
for s in stringlist do...maakt Delphi onderwater de volgende code ervan:
ShowMessage(s);
enumerator := stringlist.GetEnumerator;Je kunt dus ook zelf eenvoudig aan een eigen class deze handige enumerator functionaliteit toevoegen! Of via "class helpers" aan een bestaande class.
while enumerator.MoveNext do
begin
s := enumerator.Current;
ShowMessage(s);
end;
enumerator.Free;
Op een gegeven moment was ik het namelijk zat om steeds "for i to count-1" te gebruiken, en toen moest ik weer denken aan de eerder genoemde blogs. Met de bovenstaande code kon ik zelf een veelgebruikte class even uitbreiden met enumerators :-).
Trouwens, "for in" kun je ook gebruiken met arrays en sets:
var i:integer;
c: char;
begin
for i in intergerarray do ;
for c in teststring do ;
end;
Geen opmerkingen:
Een reactie posten