Цикл foreach
![](http://upload.wikimedia.org/wikipedia/commons/thumb/1/13/For-Loop-Mint-Programming-Language-Type-2.gif/220px-For-Loop-Mint-Programming-Language-Type-2.gif)
Конструкции цикла |
---|
В компьютерном программировании цикл foreach (или цикл for-each ) — это оператор потока управления для перемещения по элементам коллекции . foreach обычно используется вместо стандартного для цикла оператора . в отличие от других для конструкций цикла однако foreach циклы [1] обычно не поддерживают явный счетчик: по сути, они говорят «сделай это со всем в этом наборе», а не «сделай это». x раз». Это позволяет избежать потенциальных ошибок отклонения на единицу и упрощает чтение кода. В объектно-ориентированных языках итератор , даже если он неявный, часто используется в качестве средства обхода.
The Оператор 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] Красный , [4] Ruby , Scala , Smalltalk , Swift , Tcl , tcsh , оболочки Unix , Visual Basic (.NET) и Windows PowerShell . Известными языками без foreach являются C и C++ до C++11.
ActionScript 3.0 [ править ]
ActionScript поддерживает стандарт ECMAScript 4.0. [5] для for each .. in
[6] который извлекает значение по каждому индексу.
var foo : Object = {
«яблоко» : 1 ,
«апельсин» : 2
};
для каждого ( var значение : int в foo ) {
trace ( значение );
}
// возвращает «1», затем «2»
Он также поддерживает for .. in
[7] который извлекает ключ по каждому индексу.
for ( var key : String in foo ) {
trace ( key );
}
// возвращает «яблоко», затем «апельсин»
Есть [ править ]
![](http://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Wikibooks-logo-en-noslogan.svg/40px-Wikibooks-logo-en-noslogan.svg.png)
Ada поддерживает циклы foreach как часть обычного цикла for . Скажем, X — это массив :
for I in X ' диапазона Цикл
X ( I ) := Get_Next_Element ;
конец цикла ;
Этот синтаксис используется в основном с массивами, но также будет работать и с другими типами, когда требуется полная итерация.
В Ada 2012 есть обобщенные циклы для циклов foreach в любом типе контейнера (массив, списки, карты...):
for Obj of X цикла
— Работа над
концом цикла Obj ;
С [ править ]
В языке C нет коллекций или конструкции foreach. Однако он имеет несколько стандартных структур данных, которые можно использовать в качестве коллекций, а 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" ;
foreach ( p1 , s1 ) {
printf ( «цикл 1: %c \n » , * p1 );
}
foreach ( p2 , s2 ) {
printf ( «цикл 2: %c \n » , * p2 );
}
вернуть 0 ;
}
Массив C int как коллекция целых чисел (размер массива известен во время компиляции)
#include <stdio.h>
/* макрос foreach, рассматривающий массив значений int как коллекцию значений int */
#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 };
foreach ( p1 , a1 ) {
printf ( «цикл 1: %d \n » , * p1 );
}
foreach ( p2 , a2 ) {
printf ( «цикл 2: %d \n » , * p2 );
}
вернуть 0 ;
}
Самый общий: строка или массив как коллекция (размер коллекции известен во время выполнения).
#include <stdio.h>
#include <string.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 ( double , 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 ++ также поддерживает for_each
, [10] который применяет каждый элемент к функции, которая может быть любой предопределенной функцией или лямбда-выражением. Хотя диапазон 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 ( int ), v.end ( ) ), []( i } )
{
std :: cout << i << '\n' ;
;
std :: cout << "перевернуто, но пропущено 2 элемента: \n " ;
std :: for_each ( v.rbegin ( int ) + 2 , v.rend ; ( ), []( 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++/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 )
поэтому ( напечатайте i ))
и даже с функцией mapcar :
( mapcar #' print ' ( 1 3 5 6 8 10 14 17 ))
Д [ править ]
foreach ( item ; set ) {
// делаем что-то с элементом
}
или
foreach ( аргумент ) {
// передаем значение
}
Дарт [ править ]
for ( последний элемент в someCollection ) {
// делаем что-нибудь с элементом
}
Объект Паскаль, Delphi [ править ]
Поддержка 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 {
// Делаем что-нибудь для индексации
}
Круто [ править ]
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 :
код | принты |
---|---|
mapM_ печать [ 1 .. 4 ]
|
1 2 3 4 |
forM_ "test" $ \ char -> do
putChar char
putChar char
|
ттесстт |
Также возможно обобщить эти функции для работы с аппликативными функторами, а не с монадами и любой структурой данных, которую можно пройти с помощью traverse
( for
с перевернутыми аргументами) и mapM
( forM
с перевернутыми аргументами) из Data.Traversable .
Хаксе [ править ]
for ( значение в итерации ) {
trace ( значение );
}
Лямбда . iter ( итератор , функция ( значение ) трассировка ( значение ));
Ява [ править ]
В Java конструкция foreach была представлена в Java Development Kit (JDK) 1.5.0. [14]
Официальные источники используют несколько названий конструкции. Он называется «Расширенный цикл цикла». [14] «Цикл для каждого», [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
Математика [ править ]
В Математике Do
просто оценит выражение для каждого элемента списка, не возвращая никакого значения.
В [] := Сделайте [ doSomethingWithItem , { элемент , список }]
Чаще используют Table
, который возвращает результат каждой оценки в новом списке.
В [] := list = { 3 , 4 , 5 };
В [] := Таблица [ элемент ^ 2 , { элемент , список }]
Выход [] = { 9 , 16 , 25 }
МАТЛАБ [ править ]
для элемента = массив
% сделайте что-нибудь,
закончите
Нравится [ править ]
В Mint поддерживаются циклы foreach, имеющие следующий синтаксис:
для каждого элемента списка /* 'Сделать что -
нибудь.' */
конец
The for (;;)
или while (true)
бесконечная петля
в Mint можно написать с использованием цикла foreach и бесконечно длинного списка . [21]
import type
/* 'Эта функция сопоставлена'
* 'каждому индексному номеру i'
* 'бесконечно длинного списка.'
*/
subidentity InfinityList ( x )
return x
end
/* 'Следующее создает список'
0, 1, 2, 3, 4, 5, ..., бесконечность]'
*/
* ' [ = list ( identity )
for каждый элемент / бесконечного списка
* 'Делай что-нибудь навсегда.' */
конец
Objective-C [ править ]
Циклы foreach, называемые быстрым перечислением , поддерживаются начиная с Objective-C 2.0. Их можно использовать для перебора любого объекта, реализующего протокол NSFastEnumeration, включая NSArray, NSDictionary (перебирает ключи), NSSet и т. д.
NSArray * a = [ NSArray новый ]; // Любой контейнерный класс может быть заменен
на ( 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, эквивалент цикла «счетчик» в других языках — это...
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
функция:
( для каждого действия со списком )
do-something-with
является функцией с одним аргументом.
Раку [ править ]
В Raku , родственном языку Perl, for должен использоваться для обхода элементов списка ( foreach не разрешен). Выражение, обозначающее коллекцию для цикла, оценивается в контексте списка, но не выравнивается по умолчанию, и каждый элемент результирующего списка, в свою очередь, присваивается псевдониму переменной(ов) цикла.
Перечислите буквальный пример:
за 1 .. 4 {
. сказать ;
}
Примеры массивов:
для @arr {
. сказать ;
}
Цикл for в форме модификатора оператора:
. скажем, для @arr ;
для @arr -> $x {
скажите $x ;
}
for @arr -> $x , $y { # одновременно более одного элемента
скажите "$x, $y" ;
}
Пример хеша:
для ключей %hash -> $key {
скажите "$key: $hash{$key}" ;
}
или
для %хэша . кв -> $ключ , $значение {
скажите «$key: $value» ;
}
или
для %hash -> $x {
скажите «$x.key(): $x.value()» ; # Круглые скобки необходимы для встраивания в строку с двойными кавычками
}
Прямая модификация членов коллекции с помощью двойного заостренного блока <-> :
мой @arr = 1 , 2 , 3 ;
для @arr <-> $x {
$х *= 2 ;
}
# Теперь @arr = 2,4,6;
Руби [ править ]
набор . каждый делает | предмет |
# делаем что-нибудь для
завершения элемента
или
для элемента в наборе
# сделайте что-нибудь до
конца элемента
Это также можно использовать с хешем.
набор . каждый делает | ключ , значение |
# сделать что-нибудь с ключом
# сделать что-нибудь с
концом значения
Ржавчина [ править ]
The for
цикл имеет структуру for <pattern> in <expression> { /* optional statements */ }
. Он неявно вызывает IntoIterator::into_iter
метод для выражения и использует полученное значение, которое должно реализовать Iterator
черта. Если выражение само по себе является итератором, оно используется непосредственно for
пройти через реализацию IntoIterator
для всех Iterator
s , который возвращает итератор без изменений. Цикл вызывает 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!("{: ?}", цифры);
Скала [ править ]
// возвращаем список измененных элементов
items map { x => doSomething ( x ) }
items map MultipleByTwo
for { x <- items } доходность doSomething ( x )
for { x <- items } доходность MultipleByTwo ( x )
// ничего не возвращаем, просто выполните действия
items foreach { x => doSomething ( x ) }
items foreach println
for { x <- items } doSomething ( x )
for { x <- items } println ( x )
// пример сопоставления с образцом в for-comrehension
for ( ( ключ , значение ) < -someMap ) println ( s" $ key -> $ value " )
Схема [ править ]
( для каждого действия со списком )
do-something-with
является функцией с одним аргументом.
Смолток [ править ]
коллекцию сделать: [ : предмет | "сделай что-нибудь с предметом" ]
Свифт [ править ]
Свифт использует for
… in
конструкция для перебора элементов коллекции. [22]
forthing someCollection in // делаем что - {
нибудь с вещью
}
The for
… in
Цикл часто используется с конструкциями закрытого и полуоткрытого диапазона для повторения тела цикла определенное количество раз.
для меня в 0. . < 10 {
// 0..<10 создает полуоткрытый диапазон, поэтому тело цикла
// повторяется для i = 0, i = 1, …, i = 9.
}
for i in 0. . .10 {
// 0...10 создает замкнутый диапазон, поэтому тело цикла
// повторяется для i = 0, i = 1, …, i = 9, i = 10.
}
SystemVerilog [ править ]
SystemVerilog поддерживает итерацию по любому типу вектора или массива любой размерности, используя foreach
ключевое слово.
Тривиальный пример перебирает массив целых чисел:
код | принты |
---|---|
int array_1d [] = '{ 3 , 2 , 1 , 0 };
foreach array_1d [ index ]
$ display ( «array_1d[%0d]: %0d» , index , array_1d [ index ]);
|
массив_1d[0]: 3 массив_1d[1]: 2 массив_1d[2]: 1 массив_1d[3]: 0 |
Более сложный пример перебирает ассоциативный массив массивов целых чисел:
код | принты |
---|---|
int array_2d [ строка ][] = '{ "десятки" : '{ 10 , 11 },
"двадцатки" : '{ 20 , 21 } };
foreach array_2d [ ключ , индекс ]
$ display ( «array_2d[%s,%0d]: %0d» , ключ , индекс , array_2d [ ключ , индекс ]);
|
array_2d[десятки,0]: 10 array_2d[десятки,1]: 11 array_2d[двадцатые годы,0]: 20 array_2d[двадцатые годы,1]: 21 |
ТКЛ [ править ]
Tcl использует foreach для перебора списков. Можно указать более одной переменной-итератора, и в этом случае им присваиваются последовательные значения из списка.
код | принты |
---|---|
foreach { i j } { 1 2 3 4 5 6 } {
puts "$i $j"
}
|
1 2 3 4 5 6 |
Также возможно одновременно перебирать несколько списков. В следующих i
принимает последовательные значения первого списка, j
последовательные значения второго списка:
код | принты |
---|---|
foreach i { 1 2 3 } j { a b c } {
puts "$i $j"
}
|
1 а 2 б 3 с |
Visual Basic (.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>
См. также [ править ]
Ссылки [ править ]
- ^ «Язык программирования D»
foreach
Документация заявления» . Digital Mars . Проверено 4 августа 2008 г. - ^ «SWI-Пролог – foreach/2» . Swi-prolog.org . Проверено 10 февраля 2020 г.
- ^ «Ребол» .
- ^ «Красный язык программирования» .
- ^ «Предлагаемое 4-е издание ECMAScript – Обзор языка» (PDF) . Проверено 21 февраля 2020 г.
- ^ "за каждого..в" . Проверено 21 февраля 2020 г.
- ^ «для..в» . Проверено 21 февраля 2020 г.
- ^ «Функции C++11 в Visual C++ 11 — Блог группы Visual C++ — Домашняя страница сайта — Блоги MSDN» . Блоги.msdn.com. 12 сентября 2011 г. Проверено 4 августа 2013 г.
- ^ «Цикл for на основе диапазона (начиная с C++11)» . ru.cppreference.com . Проверено 03 декабря 2018 г.
- ^ «std::for_each — cppreference» . ru.cppreference.com . Проверено 30 сентября 2017 г.
- ^ «Qt 4.2: Универсальные контейнеры» . Doc.qt.digia.com. Архивировано из оригинала 23 ноября 2015 г. Проверено 4 августа 2013 г.
- ^ Эрик Ниблер (31 января 2013 г.). «Глава 9. Boost.Foreach — 1.53.0» . Boost.org . Проверено 4 августа 2013 г.
- ^ «Оговорка о диапазоне» . Спецификация языка программирования Go . Язык программирования Go . Проверено 20 октября 2013 г.
- ^ Перейти обратно: а б «Улучшено для цикла — эта новая языковая конструкция[...]» «Язык программирования Java, раздел: Улучшения в JDK 5» . Сан Микросистемс, Инк. г. 2004 Проверено 26 мая 2009 г.
- ^ «Цикл для каждого» «Цикл для каждого» . Сан Микросистемс, Инк. г. 2008 Проверено 10 мая 2009 г.
- ^ «Реализация этого интерфейса позволяет объекту быть целью оператора foreach». «Итерируемый (платформа Java SE 6)» . Сан Микросистемс, Инк. г. 2004 Проверено 12 мая 2009 г.
- ^ Перейти обратно: а б Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991 .
- ^ «Array.prototype.forEach() — JavaScript | MDN» . 16 декабря 2023 г.
- ^ «Объект.ключи» . Сеть разработчиков Mozilla . Проверено 7 мая 2014 г.
- ^ «Программирование на Lua/таблицы — Wikibooks, открытые книги для открытого мира» . ru.wikibooks.org . Проверено 6 декабря 2017 г.
- ^ Чу, Оливер. «Урок по мяте» . Проверено 20 октября 2013 г.
- ^ «Поток управления — язык программирования Swift (Swift 5.5)» .
- ^ «Элемент XSLT <xsl:for-each>» . W3Schools.com .