stringtranslate.com

Цикл foreach

Циклы foreach почти всегда используются для перебора элементов в последовательности элементов.

В компьютерном программировании цикл foreach (или цикл for-each ) — это оператор потока управления для перемещения по элементам коллекции . foreach обычно используется вместо стандартного оператора цикла for . Однако, в отличие от других конструкций цикла for , циклы foreach [1] обычно не поддерживают явный счетчик: по сути, они говорят «сделай это со всем в этом наборе», а не «сделай это x раз». Это позволяет избежать потенциальных ошибок, связанных с отклонением на единицу , и упрощает чтение кода. В объектно-ориентированных языках итератор , даже если он неявный, часто используется как средство обхода.

Оператор foreach в некоторых языках имеет определенный порядок обработки каждого элемента коллекции от первого до последнего. Оператор foreach во многих других языках, особенно в языках программирования массивов , не имеет определенного порядка. Это упрощает оптимизацию цикла в целом и, в частности, позволяет одновременно обрабатывать векторные элементы коллекции.

Синтаксис

Синтаксис варьируется в зависимости от языка. Большинство использует простое слово for, примерно следующее:

для каждого предмета коллекции: сделать что-нибудь с предметом

Языковая поддержка

Языки программирования , поддерживающие циклы foreach, включают ABC , ActionScript , Ada , C++11 , C# , язык разметки ColdFusion (CFML), Cobra , D , Daplex (язык запросов), Delphi , ECMAScript , Erlang , Java (начиная с версии 1.5), JavaScript. , Lua , Objective-C (начиная с версии 2.0), ParaSail , Perl , PHP , Prolog , [2] Python , R , REALbasic , Rebol , [3] Red , [4] Ruby , Scala , Smalltalk , Swift , Tcl , tcsh , Оболочки Unix , Visual Basic (.NET) и Windows PowerShell . Известными языками без foreach являются C и C++ до C++11.

ЭкшнСкрипт 3.0

ActionScript поддерживает стандарт ECMAScript 4.0 [5] для for each .. in[6] , который извлекает значение по каждому индексу.

var foo : Object = { «яблоко» : 1 , «апельсин» : 2 };   для каждого ( значение var : int in foo ) { trace ( значение ); }        // возвращает "1", затем "2"

Он также поддерживает for .. in[7] , который извлекает ключ по каждому индексу.

for ( var key : String in foo ) { trace ( key ); }       // возвращает «яблоко», затем «апельсин»

Ада

Ada поддерживает циклы foreach как часть обычного цикла for . Скажем, X — это массив :

for  I  in  X ' Цикл диапазона  X ( I ) := Get_Next_Element ; конец цикла ;     

Этот синтаксис используется в основном с массивами, но также будет работать и с другими типами, когда требуется полная итерация.

В Ada 2012 есть обобщенные циклы для циклов foreach в любом типе контейнера (массив, списки, карты...):

for  Obj  of  X  цикла  — Работа над концом  цикла Obj ;

С

В языке C нет коллекций или конструкции foreach. Однако он имеет несколько стандартных структур данных, которые можно использовать в качестве коллекций, а foreach можно легко создать с помощью макроса .

Однако возникают две очевидные проблемы:

Строка C как коллекция символов

#include <stdio.h> /* макрос foreach, рассматривающий строку как набор символьных значений */#define foreach(ptrvar, strvar) \char* ptrvar; \for (ptrvar = strvar; (*ptrvar) != '\0'; *ptrvar++)int main ( int argc , char ** argv ) {      char * s1 = «abcdefg» ;    char * s2 = "123456789" ;    Еогеасп ( р1 , s1 ) {    printf ( "цикл 1: %c \n " , * p1 );  } Еогеасп ( р2 , s2 ) {    printf ( "цикл 2: %c \n " , * p2 );  } вернуть 0 ; }

Массив C int как коллекция целых чисел (размер массива известен во время компиляции)

#include <stdio.h> /* макрос foreach, рассматривающий массив целочисленных значений как коллекцию целочисленных значений */#define foreach(intpvar, intarr) \int* intpvar; \for (intpvar = intarr; intpvar < (intarr + (sizeof(intarr)/sizeof(intarr[0]))); ++intpvar)int main ( int argc , char ** argv ) {      int a1 [] = { 1 , 1 , 2 , 3 , 5 , 8 };         int a2 [] = { 3 , 1 , 4 , 1 , 5 , 9 };         Еогеасп ( р1 , а1 ) {    printf ( "цикл 1: %d \n " , * p1 );  } Еогеасп ( р2 , а2 ) {    printf ( "цикл 2: %d \n " , * p2 );  } вернуть 0 ; }

Самый общий: строка или массив как коллекция (размер коллекции известен во время выполнения).

idxtypeможно удалить и typeof(col[0])использовать вместо него с помощью GCC
#include <stdio.h> #include <строка.h> /* макрос foreach, рассматривающий массив заданного типа как коллекцию значений заданного типа */#define arraylen(arr) (sizeof(arr)/sizeof(arr[0]))#define foreach(idxtype, idxpvar, col, colsiz) \idxtype* idxpvar; \for (idxpvar = col; idxpvar < (col + colsiz); ++idxpvar)int main ( int argc , char ** argv ) {      char * c1 = «коллекция» ;    int c2 [] = { 3 , 1 , 4 , 1 , 5 , 9 };         двойной * с3 ;  интервал c3len = 4 ;    c3 = ( double * ) calloc ( c3len , sizeof ( double ));     с3 [ 0 ] знак равно 1,2 ; с3 [ 1 ] = 3,4 ; с3 [ 2 ] = 5,6 ; с3 [ 3 ] = 7,8 ;            foreach ( char , p1 , c1 , strlen ( c1 )) {      printf ( "цикл 1: %c \n " , * p1 );  } foreach ( int , p2 , c2 , arraylen ( c2 )) {      printf ( "цикл 2: %d \n " , * p2 );  } foreach ( двойной , p3 , c3 , c3len ) {      printf ( "цикл 3: %.1lf \n " , * p3 );  } вернуть 0 ; }

С#

В C# предполагается, что myArray представляет собой массив целых чисел:

Еогеасп ( int x в myArray ) { Console . WriteLine ( х ); }       

Language Integrated Query (LINQ) предоставляет следующий синтаксис, принимающий делегат или лямбда-выражение :

мойМассив . К списку (). ForEach ( x => Console . WriteLine ( x ));  

С++

В C++11 предусмотрен цикл foreach. Синтаксис аналогичен синтаксису Java:

#include <iostream> int main () { int myint [] = { 1 , 2 , 3 , 4 , 5 };          for ( int i : myint ) { std :: cout << i << '\n' ; } }           

Операторы for на основе диапазона C++11 были реализованы в GNU Compiler Collection (GCC) (начиная с версии 4.6), Clang (начиная с версии 3.0) и Visual C++ 2012 (версия 11 [8] ) .

Основанный на диапазоне forявляется синтаксическим сахаром, эквивалентным:

 for ( auto __anon = начало ( myint ); __anon != end ( myint ); ++ __anon ) { auto i = * __anon ; std :: cout << i << '\n' ; }                   

Компилятор использует поиск по аргументам для разрешения функций beginи end. [9]

Стандартная библиотека C++ также поддерживает функцию [10]for_each , которая применяет каждый элемент к функции, которая может быть любой предопределенной функцией или лямбда-выражением. Хотя диапазон for действует только от начала до конца, диапазон или направление можно изменить, изменив первые два параметра.

#include <iostream> #include <algorithm> // содержит std::for_each #include <vector>   int main () { std :: vector < int > v { 1 , 2 , 3 , 4 , 5 };         std :: for_each ( v.begin (), v.end ( ), []( int i ) { std :: cout << i << ' \n' ; } ) ;           std :: cout << "перевернуто, но пропущено 2 элемента: \n " ;   std :: for_each ( v.rbegin () + 2 , v.rend ( ), []( int i ) { std :: cout << i << ' \ n' ; } ) ; }          

Qt , платформа C++, предлагает макрос, обеспечивающий циклы foreach [11] с использованием интерфейса итератора STL:

#include <QList> #include <QDebug>  int main ( ) { QList <int> list ;    список << 1 << 2 << 3 << 4 << 5 ;           foreach ( int i , list ) { qDebug () << i ; } }        

Boost , набор бесплатных проверенных портативных библиотек C++, также предоставляет циклы foreach: [12]

#include <boost/foreach.hpp> #include <iostream> int main () { int myint [] = { 1 , 2 , 3 , 4 , 5 }; BOOST_FOREACH ( int & i , myint ) { std :: cout << i << '\n' ; } }                       

С++/CLI

Язык C++/CLI предлагает конструкцию, аналогичную C#.

Предполагая, что myArray представляет собой массив целых чисел:

для каждого ( int x в myArray ) { Console :: WriteLine ( x ); }      

Язык разметки ColdFusion (CFML)

Синтаксис скрипта

// массивы arrayeach ([ 1 , 2 , 3 , 4 , 5 ],  function ( v ) {  writeOutput ( v ); });// илиfor  ( v  in  [ 1 , 2 , 3 , 4 , 5 ]) {  writeOutput ( v ); }// или// (только Railo; не поддерживается в ColdFusion) Letters  =  [ "a" , "b" , "c" , "d" , "e" ]; Letters.each ( function ( v ) {  writeOutput ( v );  // abcde });// структуры for  ( k  в  коллекции ){  writeOutput ( коллекция [ k ]); }// илиstructEach ( коллекция ,  функция ( k , v ){  writeOutput ( "key: #k# , value: #v# ;" ); });// или // (только Railo; не поддерживается в ColdFusion) Collection.each ( function ( k , v ){  writeOutput ( "key: #k# , value: #v# ;" ); });

Синтаксис тегов

<!--- arrays ---> <cfloop  index = "v"  array = " #['a','b','c','d','e']# " >  <cfoutput> # v # </cfoutput> <!--- abcde ---> </cfloop>

CFML неправильно идентифицирует значение как «индекс» в этой конструкции; переменная indexполучает фактическое значение элемента массива, а не его индекс.

<!--- структуры ---> <cfloop  item = "k"  Collection = " #collection# " >  <cfoutput> # Collection [ k ]# </cfoutput> </cfloop>

Общий Лисп

Common Lisp предоставляет возможность foreach либо с помощью макроса dolist :

( dolist ( i ' ( 1 3 5 6 8 10 14 17 )) ( распечатать i ))           

или мощный макрос цикла для обработки большего количества типов данных

( цикл для i in ' ( 1 3 5 6 8 10 14 17 ) do ( print i ))              

и даже с функцией mapcar :

( mapcar #' print ' ( 1 3 5 6 8 10 14 17 ))         

Д

foreach ( item ; set ) { // делаем что-то с элементом }   

или

foreach ( аргумент ) { // передаем значение }  

Дарт

for ( последний элемент в someCollection ) { // делаем что-нибудь с элементом }      

Объектный Паскаль, Делфи

Поддержка Foreach была добавлена ​​в Delphi 2005 и использует переменную перечислителя, которую необходимо объявить в разделе var .

для перечислителя в коллекции do Begin // сделать что-нибудь здесь end ;     

Эйфелева

Итерационная форма (foreach) конструкции Эйфелева цикла представлена ​​ключевым словом across.

my_listВ этом примере печатается каждый элемент структуры :

 через my_list как ic цикл печати ( ic . item ) end       

Локальная сущность icявляется экземпляром библиотечного класса ITERATION_CURSOR. Функция курсора itemобеспечивает доступ к каждому элементу структуры. Потомки класса ITERATION_CURSORмогут быть созданы для обработки специализированных алгоритмов итерации. Типы объектов, по которым можно выполнять итерацию ( my_listв примере), основаны на классах, наследуемых от класса библиотеки ITERABLE.

Итерационная форма цикла Эйфеля также может использоваться как логическое выражение, когда ключевое слово loopзаменяется либо all(влияет на универсальную квантификацию ), либо some(влияет на экзистенциальную квантификацию ).

Эта итерация представляет собой логическое выражение, которое истинно, если my_listколичество всех элементов в ней превышает три:

 через my_list как ic all ic . элемент . количество > 3 , конец        

Следующее верно, если хотя бы один элемент имеет счетчик больше трех:

 через my_list как ic some ic . элемент . количество > 3 , конец        

Идти

Цикл foreach в Go можно использовать для перебора массива, среза, строки, карты или канала.

Использование формы с двумя значениями позволяет получить индекс/ключ (первый элемент) и значение (второй элемент):

for index , value := range someCollection { // Делаем что-нибудь с индексом и значением }      

Использование формы с одним значением позволяет получить индекс/ключ (первый элемент):

for index := range someCollection { // Делаем что-нибудь для индексации }     

[13]

классный

Groovy поддерживает циклы по коллекциям, таким как массивы, списки и диапазоны:

def x = [ 1 , 2 , 3 , 4 ] for ( v in x ) // цикл по массиву из 4 элементов x { println v }         for ( v in [ 1 , 2 , 3 , 4 ]) // цикл по списку литералов из 4 элементов { println v }      for ( v in 1..4 ) // цикл по диапазону 1..4 { println v }      

Groovy также поддерживает цикл for в стиле C с индексом массива:

for ( я = 0 ; я < x . size (); я ++) { println x [ я ] }         

Коллекции в Groovy также можно перебирать, используя каждое ключевое слово и замыкание. По умолчанию шаблон цикла называется

Икс . каждый { println it } // печатаем каждый элемент массива x x . each { i -> println i } // эквивалент строки выше, только фиктивный цикл с явным именем "i"       

Хаскелл

Haskell позволяет перебирать списки с помощью монадических действий, используя mapM_и forM_( mapM_с перевернутыми аргументами) из Control.Monad:

Также возможно обобщить эти функции для работы с аппликативными функторами, а не с монадами и любой проходимой структурой данных, используя traverse( forс перевернутыми аргументами) и mapM( forMс перевернутыми аргументами) из Data.Traversable.

Хаксе

for ( значение в итерации ) { trace ( значение ); }     Лямбда . iter ( итератор , функция ( значение ) трассировка ( значение ));  

Джава

В Java конструкция foreach была представлена ​​в Java Development Kit (JDK) 1.5.0. [14]

Официальные источники используют несколько названий конструкции. Его называют «расширенным циклом for», [14], «циклом For-Each», [15] и «оператором foreach». [16] [17] : 264 

for ( Type item : iterableCollection ) { // Делаем что-нибудь с элементом }      

Java также предоставляет API потока, начиная с Java 8: [17] : 294–203. 

 Список < Целое число > intList = Список . из ( 1 , 2 , 3 , 4 ); intList . транслировать (). forEach ( i - > System.out.println ( i ) ) ;         

JavaScript

Стандарт ECMAScript 6 предназначен for..ofдля итерации без индексов по генераторам, массивам и многому другому:

for ( var item of array ){ // Делаем что-нибудь }     

Альтернативно, стиль, основанный на функциях: [18]

множество . forEach ( item => { // Делаем что-нибудь })   

Для неупорядоченного перебора ключей в объекте в JavaScript предусмотрен for...inцикл:

for ( var key in object ) { // Делаем что-нибудь с object[key] }      

Чтобы ограничить итерацию собственными свойствами объекта, исключая те, которые унаследованы через цепочку прототипов, иногда полезно добавить тест hasOwnProperty(), если он поддерживается движком JavaScript (для WebKit/Safari это означает «в версии 3 или более поздней версии»). ").

for ( var key in object ) { if ( object . hasOwnProperty ( key )) { // Делаем что-то с object[key] } }          

ECMAScript 5 предоставил метод Object.keys для передачи собственных ключей объекта в массив. [19]

var book = { name : «Рождественская история» , автор : «Чарльз Диккенс» }; for ( var key of Object.keys ( book )){ alert ( "PropertyName = " key + " Property Value = " + book [ key ] ) ; }                  

Луа

Источник: [20]

Выполняйте итерацию только по числовым значениям индекса:

для  индекса ,  значение  в  ipairs ( массиве )  do -- сделать что-нибудь, закончить

Перебрать все значения индекса:

для  индекса ,  значения  в  парах ( массиве )  do -- сделать что-нибудь end

Математика

В Mathematica просто Doвычисляет выражение для каждого элемента списка, не возвращая никакого значения.

В [] := Сделайте [ doSomethingWithItem , { элемент , список }]   

Чаще используется Table, который возвращает результат каждой оценки в новом списке.

В [] := list = { 3 , 4 , 5 };     В [] := Таблица [ элемент ^ 2 , { элемент , список }] Выход [] = { 9 , 16 , 25 }      

МАТЛАБ

для элемента = массив % сделайте что-нибудь, закончите   

Мятный

В Mint поддерживаются циклы foreach, имеющие следующий синтаксис:

для каждого элемента списка /* ' Сделать что-нибудь.' */ конец     

Цикл for (;;)или while (true) бесконечный цикл в Mint можно написать с использованием цикла for каждого и бесконечно длинного списка . [21]

import type /* 'Эта функция сопоставлена' * 'каждому индексному номеру i' * 'бесконечно длинного списка.' */ subidentity ( x ) return x end /* 'Следующее создает список' * '[0, 1, 2, 3, 4, 5, ..., бесконечность]' * / InfinityList = list ( identity ) for каждый элемент бесконечного списка /* 'Делай что-нибудь навсегда.' */ конец           

Цель-C

Циклы foreach, называемые быстрым перечислением , поддерживаются начиная с Objective-C 2.0. Их можно использовать для перебора любого объекта, реализующего протокол NSFastEnumeration, включая NSArray, NSDictionary (перебирает ключи), NSSet и т. д.

NSArray * a = [ NSArray новый ]; // Любой класс-контейнер можно заменить     for ( id obj in a ) { // Используется динамическая типизация. Тип объекта, хранящегося // в 'a', может быть неизвестен. Массив может содержать множество различных // типов объектов.        printf ( "%s \n " , [[ описание объекта ] UTF8String ]); // Необходимо использовать UTF8String с %s NSLog ( @"%@" , obj ); // Оставить как объект }       

NSArrays также может транслировать сообщение своим членам:

NSArray * a = [ NSArray новый ];    [ a makeObjectsPerformSelector : @selector ( printDescription )]; 

Если блоки доступны, NSArray может автоматически блокировать каждый содержащийся элемент:

[ myArray enumerateObjectsUsingBlock :^ ( id obj , NSUInteger idx , BOOL * stop ) { NSLog ( @"obj %@" , obj ); if ([ obj mustStopIterationNow ]) * stop = YES ; }];           

Тип итерируемой коллекции будет определять элемент, возвращаемый при каждой итерации. Например:

NSDictionary * d = [ NSDictionary новый ];    for ( id ключа в d ) { NSObject * obj = [ d objectForKey : key ]; // Мы используем (уникальный) ключ для доступа к (возможно, неуникальному) объекту. NSLog ( @"%@" , obj ); }            

OCaml

OCamlфункциональный язык программирования . Таким образом, эквивалент цикла foreach можно реализовать как библиотечную функцию над списками и массивами.

Для списков:

Список . iter  ( fun  x  ->  print_int  x )  [ 1 ; 2 ; 3 ; 4 ];;

или короче:

Список . итер  print_int  [ 1 ; 2 ; 3 ; 4 ];;

Для массивов:

Множество . iter  ( fun  x  ->  print_int  x )  [| 1 ; 2 ; 3 ; 4 |];;

или короче:

Множество . итер  print_int  [| 1 ; 2 ; 3 ; 4 |];;

ПараСейл

Язык параллельного программирования ParaSail поддерживает несколько типов итераторов, включая общий итератор «для каждого» над контейнером:

var  Con  :  Контейнер < Тип_элемента >  :=  .. . // ... для  каждого  параллельного цикла Elem  of  Con  // цикл также может быть «прямым», «обратным» или неупорядоченным (по умолчанию) // ... сделать что-нибудь с конечным циклом Elem    

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" ];для  каждого  [ Str  =>  Tr ]  из  My_Map  { Str  in  My_Set }  цикл вперед  // ... делаем что-то с концом цикла Str или Tr  

Паскаль

В языке Pascal стандарт ISO 10206:1990 ввел итерацию по заданным типам , таким образом:

вар элт : ElementType ; eltset : набор ElementType ;      {...}for elt в eltset do { ... сделать что-нибудь с elt }     

Перл

В Perl foreach (эквивалент более короткого for) может использоваться для обхода элементов списка . Выражение, обозначающее коллекцию для цикла, оценивается в контексте списка, и каждому элементу результирующего списка, в свою очередь, присваивается псевдоним переменной цикла.

Перечислите буквальный пример:

Еогеасп ( 1 , 2 , 3 , 4 ) { печать $_ ; }       

Примеры массивов:

foreach ( @arr ) { печать $_ ; }    
foreach $x ( @arr ) { #$x — это элемент в @arr print $x ; }      

Пример хеша:

foreach $x ( ключи %hash ) { print $x . " = " $хеш { }; # $x — это ключ в %hash, а $hash{$x} — его значение }           

Прямая модификация членов коллекции:

@arr = ( 'remove-foo' , 'remove-bar' ); foreach $x ( @arr ){ $x =~ s/remove-// ; } # Теперь @arr = ('foo', 'bar');          

PHP

foreach  ( $set  as  $value )  {  // Делаем что-нибудь с $value; }

Также возможно извлечь как ключи, так и значения, используя альтернативный синтаксис:

foreach  ( $set  as  $key  =>  $value )  {  echo  " { $key } имеет значение { $value } " ; }

Прямая модификация членов коллекции:

$arr  =  массив ( 1 ,  2 ,  3 ); foreach  ( $arr  as  & $value )  {  // &, $value является ссылкой на исходное значение внутри $arr  $value ++ ; } // Теперь $arr = array(2, 3, 4);// также работает с полным синтаксисом foreach  ( $arr  as  $key  =>  & $value )  {  $value ++ ; }

Питон

for  item  в  iterable_collection :  # Сделайте что-нибудь с элементом

Назначение кортежа в Python, полностью доступное в цикле foreach, также упрощает перебор пар (ключ, значение) в ассоциативных массивах :

для  ключа  значение  в  some_dict . items ():  # Прямая итерация по dict, перебираем его ключи  # Делаем что-нибудь

Поскольку for ... inэто единственный вид цикла for в Python, эквивалент цикла «counter» в других языках:

for  i  in  range ( len ( seq )):  # Сделайте что-нибудь для seq[i]

... хотя использование этой enumerateфункции считается более «Pythonic»:

for  i ,  item  in  enumerate ( seq ):  # Делаем что-то с элементом  # Возможно, присваиваем его обратно seq[i]

р

for ( элемент в объекте ) { # Сделайте что-нибудь с элементом }    

Поскольку for ... inэто единственный вид forцикла в R, эквивалент цикла «счетчик» в других языках:

for ( i in seq_along ( object )) { # Сделайте что-нибудь с объектом[[i]] }    

Ракетка

( for ([ набор элементов ]) ( сделать что-нибудь с элементом ))    

или используя обычную for-eachфункцию Scheme:

( для каждого действия со списком )  

do-something-withявляется функцией с одним аргументом.

Раку

В Raku , родственном языку Perl, for должен использоваться для обхода элементов списка ( foreach не разрешен). Выражение, обозначающее коллекцию для цикла, оценивается в контексте списка, но не выравнивается по умолчанию, и каждый элемент результирующего списка, в свою очередь, присваивается псевдониму переменной(ов) цикла.

Перечислите буквальный пример:

за  1 .. 4 { . сказать ;}

Примеры массивов:

для  @arr { . сказать ;}

Цикл for в форме модификатора оператора:

. скажем,  для  @arr ;
for  @arr -> $x { скажем  $x ;}
for  @arr -> $x , $y { # одновременно более одного элемента  скажите  "$x, $y" ;}

Пример хеша:

для  ключей  %hash -> $key { скажите  "$key: $hash{$key}" ;}

или

для  %хэша . kv -> $key , $value { скажите  "$key: $value" ;}

или

for  %hash -> $x { скажем  "$x.key(): $x.value()" ; # Круглые скобки необходимы для встраивания в строку с двойными кавычками}


Прямая модификация членов коллекции с помощью двойного заостренного блока <-> :

мой  @arr = 1 , 2 , 3 ;for  @arr <-> $x { $x *= 2 ;}# Теперь @arr = 2,4,6;

Рубин

набор . каждый делает | предмет | # делаем что-нибудь для завершения элемента   

или

для элемента в наборе # сделайте что-нибудь до конца элемента    

Это также можно использовать с хешем.

набор . каждый делает | ключ , значение | # сделать что-нибудь с ключом # сделать что-нибудь с концом значения    

Ржавчина

Цикл forимеет структуру . Он неявно вызывает метод IntoIterator::into_iter для выражения и использует полученное значение, которое должно реализовывать признак Iterator. Если выражение само по себе является итератором, оно используется непосредственно в цикле через реализацию IntoIterator для всех итераторов, которая возвращает итератор без изменений. Цикл вызывает метод итератора перед выполнением тела цикла. Если return , значение внутри присваивается шаблону и выполняется тело цикла; если он возвращает , цикл завершается.for <pattern> in <expression> { /* optional statements */ }forIterator::nextIterator::nextSome(_)None

пусть числа mut = vec! [ 1 , 2 , 3 ];      // Неизменяемая ссылка: for Number in & Numbers { // вызывает IntoIterator::into_iter(&numbers) println! ( "{}" , число ); }       для квадрата в цифрах . итер (). map ( | x | x * x ) { // Numbers.iter().map(|x| x * x) реализует итератор println! ( "{}" , квадрат ); }          // Изменяемая ссылка: for Number in & mut Numbers { // вызывает IntoIterator::into_iter(&mut Numbers) * Number *= 2 ; }         // печатает "[2, 4, 6]": println! ( "{:?}" , числа ); // Потребляет Vec и создает итератор: for Number in Numbers { // вызывает IntoIterator::into_iter(numbers) // ... }      // Ошибки с "заимствованием перемещенного значения": // println!("{:?}", Numbers);

Скала

// возвращаем список измененных элементов items map { x = > doSomething ( x ) }        for { x <- элементы } доходность doSomething ( x ) for { x <- элементы } выход multiByTwo ( x )          // ничего не возвращаем, просто выполняем действия items foreach { x => doSomething ( x ) } items foreach println        for { x <- элементы } doSomething ( x ) for { x <- элементы } println ( x )        // пример сопоставления с образцом в for-comprehension for (( key , value ) <- someMap ) println ( s" $ key -> $ value " )     

Схема

( для каждого действия со списком )  

do-something-withявляется функцией с одним аргументом.

Болтовня

коллекцию  сделать: [ : предмет |  "сделай что-нибудь с предметом" ]

Быстрый

Swift использует конструкцию forinдля перебора членов коллекции. [22]

forthing in someCollection { // делаем что-нибудь с вещью }     

Цикл forinчасто используется с конструкциями закрытого и полуоткрытого диапазона для повторения тела цикла определенное количество раз.

для меня в 0. . < 10 { // 0..<10 создает полуоткрытый диапазон, поэтому тело цикла // повторяется для i = 0, i = 1, …, i = 9. }      для меня в 0. . .10 { // 0...10 создает замкнутый диапазон, поэтому тело цикла // повторяется для i = 0, i = 1, …, i = 9, i = 10. }      

СистемаVerilog

SystemVerilog поддерживает итерацию по любому типу вектора или массива любой размерности с использованием foreachключевого слова.

Тривиальный пример перебирает массив целых чисел:

Более сложный пример перебирает ассоциативный массив массивов целых чисел:

Ткл

Tcl использует foreach для перебора списков. Можно указать более одной переменной-итератора, и в этом случае им присваиваются последовательные значения из списка.

Также возможно одновременно перебирать несколько списков. Далее iпредполагаются последовательные значения первого списка, jпоследовательные значения второго списка:

Визуальный Бейсик (.NET)

Для каждого элемента в перечисляемом ' Сделайте что-нибудь с элементом. Следующий     

или без вывода типа

Для каждого элемента As введите In enumerable ' Сделайте что-нибудь с элементом. Следующий       

Окна

Обычный командный процессор

Вызовите гипотетическую frobкоманду три раза, каждый раз присваивая ей название цвета.

C:\> FOR  %% a IN  ( красный зеленый синий )  DO frob %% a

Windows PowerShell

foreach  ( $item  in  $set )  {  # Сделайте что-нибудь с $item }

Из трубопровода

$список  |  ForEach -Object  { Write-Host  $_ }# или используя псевдонимы $list  |  Еогеасп  { запись $_ } $list  |  %  { напишите $_ }

XSLT

 <xsl:for-each select= "set" > <!-- сделайте что-нибудь с элементами в <set> --> </xsl:for-each>   

[23]

Смотрите также

Рекомендации

  1. ^ «Документация по операторам языка программирования D foreach» . Цифровой Марс . Проверено 4 августа 2008 г.
  2. ^ "SWI-Пролог - foreach/2" . Swi-prolog.org . Проверено 10 февраля 2020 г.
  3. ^ "Ребол".
  4. ^ «Красный язык программирования».
  5. ^ «Предлагаемое 4-е издание ECMAScript - Обзор языка» (PDF) . Проверено 21 февраля 2020 г.
  6. ^ "для каждого...в" . Проверено 21 февраля 2020 г.
  7. ^ "для...в" . Проверено 21 февраля 2020 г.
  8. ^ «Функции C++11 в Visual C++ 11 — Блог группы Visual C++ — Домашняя страница сайта — Блоги MSDN» . Блоги.msdn.com. 12 сентября 2011 г. Проверено 4 августа 2013 г.
  9. ^ «Цикл for на основе диапазона (начиная с C++11)» . ru.cppreference.com . Проверено 03 декабря 2018 г.
  10. ^ "std::for_each - cppreference". ru.cppreference.com . Проверено 30 сентября 2017 г.
  11. ^ «Qt 4.2: Универсальные контейнеры». Doc.qt.digia.com. Архивировано из оригинала 23 ноября 2015 г. Проверено 4 августа 2013 г.
  12. ^ Эрик Ниблер (31 января 2013 г.). «Глава 9. Boost.Foreach — 1.53.0». Boost.org . Проверено 4 августа 2013 г.
  13. ^ "Пункт о диапазоне" . Спецификация языка программирования Go . Язык программирования Go . Проверено 20 октября 2013 г.
  14. ^ ab «Улучшено для цикла — эта новая языковая конструкция [...]» «Язык программирования Java, раздел: Улучшения в JDK 5». Сан Микросистемс, Инк. 2004 г. Проверено 26 мая 2009 г.
  15. ^ «Цикл для каждого» «Цикл для каждого». Сан Микросистемс, Инк. 2008 г. Проверено 10 мая 2009 г.
  16. ^ «Реализация этого интерфейса позволяет объекту быть целью оператора foreach».«Итерируемый (платформа Java SE 6)». Сан Микросистемс, Инк. 2004 г. Проверено 12 мая 2009 г.
  17. ^ Аб Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991.
  18. ^ "Array.prototype.forEach() - JavaScript | MDN" . 16 декабря 2023 г.
  19. ^ "Объект.ключи". Сеть разработчиков Mozilla . Проверено 7 мая 2014 г.
  20. ^ «Программирование на Lua/таблицы — Wikibooks, открытые книги для открытого мира» . ru.wikibooks.org . Проверено 6 декабря 2017 г.
  21. ^ Чу, Оливер. «Урок по мяте» . Проверено 20 октября 2013 г.
  22. ^ «Поток управления — язык программирования Swift (Swift 5.5)» .
  23. ^ «Элемент XSLT <xsl:for-each>» . W3Schools.com .