Форич петља (енгл.For each или foreach) је програмски језик, идиом , за пролажење кроз ставке у збирци. Foreach се обично користи уместо стандардне for изјаве. За разлику од других for петљи, foreach петље[1][2] обично одржавају неизричити бројач: они у суштини кажу "уради ово свима у овом сету", више него "уради ово х пута". Овиме се избегава могућа "грешка за један" и чини код лакшим за читање . У објектно оријентисаним језицима итератор, чак и ако имплицитно, се често користи као средство за пролазак.
Синтакса
Синтакса варира међу језицима. Највише се користи једноставна реч for, отприлике овако:
C језик нема збирке или foreach конструкције. Она, међутим, има велики број стандардних структурних података који могу бити тешки као збирке, и foreach могу бити лако направљене са макроом.
Међутим, постоје два очигледна проблема:
Макро је хигијенски неисправан - он декларише нову вредност у постојећем обиму који преостаје након петље.
Не можете се дефинисати јединствени foreach макро који ради са различитим типовима збирке (нпр. низ и повезана листа) или који се може проширити на типове корисника.
Тренутно, C++11 опсег заснован на изјавама је реализован у GCC (још у верзији 4.6), јека (још у верзији 3.0) и Вижуал C++ 2012 (верзија 11[3])
Qt, C++ оквир, нуди макро форич петље[4] користи STL итератор интерфејс:
for each (int x in myArray)
{
Console::WriteLine(x);
}
CFML
Script syntax
// низовиarrayeach([1,2,3,4,5],function(v){writeOutput(v);});// илиfor(vin[1,2,3,4,5]){writeOutput(v);}// или// (Реило само; не подржава у ColdFusion-у)letters=["a","b","c","d","e"];letters.each(function(v){writeOutput(v);// abcde});// структуреfor(kincollection){writeOutput(collection[k]);}// илиstructEach(collection,function(k,v){writeOutput("key: #k#, value: #v#;");});// или// (Реило само; не подржава у ColdFusion-у)collection.each(function(k,v){writeOutput("key: #k#, value: #v#;");});
Tag syntax
<!--- arrays ---><cfloopindex="v"array="#['a','b','c','d','e']#"><cfoutput>#v#</cfoutput><!--- a b c d e ---></cfloop>
Имати на уму да CFML погрешно идентификује вредност као "индекс" у овој конструкцији; index променљива прима стварну вредност елемента низа , а не његов индекс.
Итерациони (форич) облик Eiffel петље уводи кључ across.
У овом примери, сваки елемент структуре my_list је иштампан:
acrossmy_listasicloopprint(ic.item)end
Локални ентитет ic је инстанца класе библиотека ITERATION_CURSOR. Функција item пружа приступ сваком елементу структуре. Потомци класе ITERATION_CURSOR могу бити креирани за руковање специјализованих итерација алгоритама. Врсте објеката који могу бити поново пронађени (my_list in the example)су базирани на класама које наследе из класе библиотеке ITERABLE.
Groovy подржава for петље преко збирки попут низова, листи и опсега :
defx=[1,2,3,4]for(vinx)// петља над 4-елемента низа х{printlnv}for(vin[1,2,3,4])// петља над 4-елемента литералне листе{printlnv}for(vin1..4)// петља над опсегом 1..4{printlnv}
Groovy такође подржава C-стил за петљу са индексом низа :
for(i=0;i<x.size();i++){printlnx[i]}
Збирке у Groovy такође могу бити поновљене коришћењем кључне речи сваки и затварањем. По подразумеваном подешавању, петља лутка је тако названа
x.each{printlnit}// штампа сваки лемента низа хx.each{i->printlni}// еквивалентно линији испод, само лутка петље експлицитно названа "i"
Петља преко листи са monadic активностима користи mapM_и forM_ (mapM_ са обрнутим аргументима) из Control.Monad:
код
штампа
mapM_print[1..4]
1
2
3
4
forM_"test"$\char->doputCharcharputCharchar
tteesstt
Такође је могуће генерализовати те функције да раде на апликативним функторима пре него монаде и било које структуре података које пролазе користећи traverse (for са обрнутим аргументима) и mapM (forM са обрнутим аргументима) из Data.Traversable.
За не наређено понављање над кључевима у Object, JavaScript карактеришеfor...in петљу:
for(varkeyinobject){// Радити нешто са објектом [кључем]}
Да би се ограничило понављање на сопственим особинама објекта, искључујући оне наслеђене кроз прототип ланца, понекад је корисније додати hasOwnProperty() тест, ако је подржано од стране JavaScript-а(за WebKit/Safari, то значи "у верзији 3 или касније").
for(varkeyinobject){if(object.hasOwnProperty(key)){// Радити нешто са објектом [кључем]}}
У ECMAScript 5 могуће је користити метод кључева функције Object да понови преко сопствених кључева природније.
[10]
varbook={name:"A Christmas Carol",author:"Charles Dickens"};Object.keys(book).forEach(function(key,index){alert("PropertyName = "key+" Property Value = "+book[key]);}
У ECMAScript 5 такође је могуће користити forEach изворног низа.[11]
Gecko-ов JavaScript енџин такође има for each...in изјаву, која примењује преко вредности у објекту, а не преко кључева.[12]
Имајте на уму да није препоручљиво користити for...in или for each...in изјаву на низ објеката у JavaScript-и, због горе поменутог проблема имовине наслеђеног од прототипа, као и зато што он само примењује већ постојеће кључеве и не гарантује да ће поновити над елементима у одређеном смеру. Требало би користити редован С-стил петље. EcmaScript 6 има for..of за понављање индекса над генераторима, низовима и више.
importtype/* 'Ова функција је такође мапирана' * 'сваки број индекса i ' * 'бесконачно дуга листа.' */subidentity(x)returnxend/* 'Следеће ствара листу' * '[0, 1, 2, 3, 4, 5, ..., бесконачност]' */infiniteList=list(identity)foreachelementofinfiniteList/* 'Ради нешто вечно.' */end
Foreach петље, под називом Objective-C, су у почетку подржани у Objective-C 2.0. Могу се користити да понављају било који објекат који иплементира NSFastEnumeration протокол, укључујући и NSArray, NSDictionary (врши понављање преко кључева), NSSet, etc.
NSArray*a=[NSArraynew];// Било која класа садржине може бити супституисанаfor(idobjina){// Имати на уму да динамично куцање (не морамо да знамо// Тип објектна који је сачуван у 'a'. У ствари, може бити// много различитих типова објекта у реду.printf("%s\n",[[objdescription]UTF8String]);// Највише се користи UTF8String са %sNSLog(@"%@",obj);// Излази као објекат}
NSArrays могу такође да емитују поруку њиховим члановима:
Тип колекције који се понавља ће диктирати ставку која ће се враћати приликом сваког понављања.
На пример:
NSDictionary*d=[NSDictionarynew];for(idkeyind){NSObject*obj=[dobjectForKey:key];// Користимо (јединствен) кључ како би се приступило (могуће неједниственом) објекту.NSLog(@"%@",obj);}
ParaSail паралелно програмском језику подржава неколико врсти итератора, укључујући и општи "фор ич" итератор над садрживачем:
var Con : Container<Element_Type> := ...
// ...
for each Elem of Con concurrent loop // петља такође може бити "напредна" или "назадујућа" или неодређена (подрзумевана)
// ... радити нешто са Elem
end loop
ParaSail такође подржава филтере над итераторима, као и могућност да се позива и на кључ и на вредност мапе. Овде итерација над елементима "My_Map" бира само оне елементе код којих су кључеви у "My_Set":
var My_Map : Map<Key_Type => Univ_String, Value_Type => Tree<Integer>> := ...
const My_Set : Set<Univ_String> := ["abc", "def", "ghi"];
for each [Str => Tr] of My_Map {Str in My_Set} forward loop
// ... радити нешто са Str или Tr
end loop
У Perl програмском језику, форич (што је еквивалентно краћем for ) може се користити за пребацивање елемената листе. Израз који означава збику петље се оцењује у листу контекста и свака ставка резултата листе је, заузврат, шифрован за вредност петље.
Буквални пример листе:
foreach(1,2,3,4){print$_;}
Пример низа:
foreach(@arr){print$_;}
foreach$x(@arr){#$x је елемент у @arrprint$x;}
Хеш пример:
foreach$x(keys%hash){print$x." = ".$hash{$x};# $x је кључ у %hash и $hash{$x} је његова вредност}
Директна модификација чланова збирке:
@arr=('remove-foo','remove-bar');foreach$x(@arr){$x=~s/remove-//;}# Сада @arr = ('foo', 'bar');
foreach($setas$value){// Урадити нешто над $value;}
Такође је могуће екстрактовати оба кључа и вредности користећи се алтернативном синтаксом:
foreach($setas$key=>$value){echo"{$key} има вредност од {$value}";}
Direct modification of collection members:
$arr=array(1,2,3);foreach($arras&$value){// Приметити &, $value је референца оригиналне вредности унутар $arr$value++;}// Сада $arr = array(2, 3, 4);// такође ради са потпуном синтаксомforeach($arras$key=>&$value){$value++;}
// враћа листу модификованих елеменатаitemsmap{x=>doSomething(x)}itemsmapmultiplyByTwofor{x<-items}yielddoSomething(x)for{x<-items}yieldmultiplyByTwo(x)// не враћа ништа, само извршава акцијуitemsforeach{x=>doSomething(x)}itemsforeachprintlnfor{x<-items}doSomething(x)for{x<-items}println(x)
Swift користи for…in конструкција за понављање кроз чланове збирке.[14]
forthinginsomeCollection{// ради нешто са ствари}
for…in петља се често користи са затвореним и отвореним интервалима за понављање кроз тело петље одређени број пута.
foriin0..<10{// 0..<10 конструише полу-отворени интервал, тако да је тело петље// поновљено за i = 0, i = 1, …, i = 9.}foriin0...10{// 0...10 конструише затворени интервал, тако да је тело петље// поновљено за i = 0, i = 1, …, i = 9, i = 10.}
Tcl користи foreach за понављање над листама. Могуће је навести више од једног итератора променљиве, у чијем случају су додељене узастопне вредности из листе.
код
штампа
foreach{ij}{123456}{puts"$i $j"}
1 2
3 4
5 6
Такође је могуће понављање над више од једне листе истовремено . У наставку i преузима низ наведених вредности прве листе, j низ вредности друге листе: