В компьютерном программировании цикл 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.
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' ; } }
Язык C++/CLI предлагает конструкцию, аналогичную C#.
Предполагая, что myArray представляет собой массив целых чисел:
для каждого ( int x в myArray ) { Console :: WriteLine ( x ); }
// массивы 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 ) ) ;
Стандарт 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 каждый элемент бесконечного списка /* 'Делай что-нибудь навсегда.' */ конец
Циклы 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 — функциональный язык программирования . Таким образом, эквивалент цикла 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');
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 */ }
for
Iterator::next
Iterator::next
Some(_)
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 использует конструкцию for
… in
для перебора членов коллекции. [22]
forthing in someCollection { // делаем что-нибудь с вещью }
Цикл for
… in
часто используется с конструкциями закрытого и полуоткрытого диапазона для повторения тела цикла определенное количество раз.
для меня в 0. . < 10 { // 0..<10 создает полуоткрытый диапазон, поэтому тело цикла // повторяется для i = 0, i = 1, …, i = 9. } для меня в 0. . .10 { // 0...10 создает замкнутый диапазон, поэтому тело цикла // повторяется для i = 0, i = 1, …, i = 9, i = 10. }
SystemVerilog поддерживает итерацию по любому типу вектора или массива любой размерности с использованием foreach
ключевого слова.
Тривиальный пример перебирает массив целых чисел:
Более сложный пример перебирает ассоциативный массив массивов целых чисел:
Tcl использует foreach для перебора списков. Можно указать более одной переменной-итератора, и в этом случае им присваиваются последовательные значения из списка.
Также возможно одновременно перебирать несколько списков. Далее i
предполагаются последовательные значения первого списка, j
последовательные значения второго списка:
Для каждого элемента в перечисляемом ' Сделайте что-нибудь с элементом. Следующий
или без вывода типа
Для каждого элемента As введите In enumerable ' Сделайте что-нибудь с элементом. Следующий
Вызовите гипотетическую frob
команду три раза, каждый раз присваивая ей название цвета.
C:\> FOR %% a IN ( красный зеленый синий ) DO frob %% a
foreach ( $item in $set ) { # Сделайте что-нибудь с $item }
Из трубопровода
$список | ForEach -Object { Write-Host $_ }# или используя псевдонимы $list | Еогеасп { запись $_ } $list | % { напишите $_ }
<xsl:for-each select= "set" > <!-- сделайте что-нибудь с элементами в <set> --> </xsl:for-each>
[23]