Цикл foreach

Конструкции цикла |
---|
В компьютерном программировании цикл foreach (или цикл for-each ) — это оператор потока управления для перемещения по элементам коллекции . foreach обычно используется вместо стандартного для цикла оператора . В отличие от других для конструкций цикла однако foreach циклы [ 1 ] обычно не поддерживают явный счетчик: по сути, они говорят «сделай это со всем в этом наборе», а не «сделай это». x раз». Это позволяет избежать потенциальных ошибок отклонения на единицу и упрощает чтение кода. В объектно-ориентированных языках итератор , даже если он неявный, часто используется в качестве средства обхода.
The Оператор foreach в некоторых языках имеет определенный порядок обработки каждого элемента коллекции от первого до последнего. Оператор foreach во многих других языках, особенно в языках программирования массивов , не имеет определенного порядка. Это упрощает оптимизацию цикла в целом и, в частности, позволяет одновременно обрабатывать векторные элементы коллекции.
Синтаксис
[ редактировать ]Синтаксис варьируется в зависимости от языка. Большинство использует простое слово for
, хотя другие используют более логичное слово foreach
, примерно так:
foreach(key, value) in collection { # Do something to value # }
Языковая поддержка
[ редактировать ]Языки программирования , поддерживающие циклы foreach, включают ABC , ActionScript , Ada , C++ (начиная с 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.
ЭкшнСкрипт 3.0
[ редактировать ]ActionScript поддерживает стандарт ECMAScript 4.0. [ 5 ] для for each .. in
[ 6 ] который извлекает значение по каждому индексу.
var foo:Object = {
"apple":1,
"orange":2
};
for each (var value:int in foo) {
trace(value);
}
// returns "1" then "2"
Он также поддерживает for .. in
[ 7 ] который извлекает ключ по каждому индексу.
for (var key:String in foo) {
trace(key);
}
// returns "apple" then "orange"
Есть
[ редактировать ]
Ada поддерживает циклы foreach как часть обычного цикла for . Скажем, X — это массив :
for I in X'Range loop
X (I) := Get_Next_Element;
end loop;
Этот синтаксис используется в основном с массивами, но также будет работать и с другими типами, когда требуется полная итерация.
В Ada 2012 есть обобщенные циклы для циклов foreach в любом типе контейнера (массив, списки, карты...):
for Obj of X loop
-- Work on Obj
end loop;
С
[ редактировать ]В языке C нет коллекций или конструкции foreach. Однако он имеет несколько стандартных структур данных, которые можно использовать в качестве коллекций, а foreach можно легко создать с помощью макроса .
Однако возникают две очевидные проблемы:
- Макрос негигиеничен: он объявляет новую переменную в существующей области видимости, которая остается после цикла.
- Невозможно определить один макрос foreach, который будет работать с разными типами коллекций (например, массивом и связанным списком) или который будет расширяться для типов пользователей.
Строка C как коллекция символов
#include <stdio.h>
/* foreach macro viewing a string as a collection of char values */
#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("loop 1: %c\n", *p1);
}
foreach (p2, s2) {
printf("loop 2: %c\n", *p2);
}
return 0;
}
Массив C int как коллекция целых чисел (размер массива известен во время компиляции)
#include <stdio.h>
/* foreach macro viewing an array of int values as a collection of int values */
#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("loop 1: %d\n", *p1);
}
foreach (p2, a2) {
printf("loop 2: %d\n", *p2);
}
return 0;
}
Самый общий: строка или массив как коллекция (размер коллекции известен во время выполнения).
#include <stdio.h>
#include <string.h>
/* foreach macro viewing an array of given type as a collection of values of given type */
#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 = "collection";
int c2[] = {3, 1, 4, 1, 5, 9};
double* c3;
int c3len = 4;
c3 = (double*)calloc(c3len, sizeof(double));
c3[0] = 1.2; c3[1] = 3.4; c3[2] = 5.6; c3[3] = 7.8;
foreach (char, p1, c1, strlen(c1)) {
printf("loop 1: %c\n", *p1);
}
foreach (int, p2, c2, arraylen(c2)) {
printf("loop 2: %d\n", *p2);
}
foreach (double, p3, c3, c3len) {
printf("loop 3: %.1lf\n", *p3);
}
return 0;
}
С#
[ редактировать ]В C# предполагается, что myArray представляет собой массив целых чисел:
foreach (int x in myArray) { Console.WriteLine(x); }
Language Integrated Query (LINQ) предоставляет следующий синтаксис, принимающий делегат или лямбда-выражение :
myArray.ToList().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 = begin(myint); __anon != end(myint); ++__anon)
{
auto i = *__anon;
std::cout << i << '\n';
}
Компилятор использует поиск, зависящий от аргументов, для разрешения begin
и end
функции. [ 9 ]
также Стандартная библиотека C++ поддерживает for_each
, [ 10 ] который применяет каждый элемент к функции, которая может быть любой предопределенной функцией или лямбда-выражением. Хотя диапазон for действует только от начала до конца, диапазон или направление можно изменить, изменив первые два параметра.
#include <iostream>
#include <algorithm> // contains 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 << "reversed but skip 2 elements:\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;
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 представляет собой массив целых чисел:
for each (int x in myArray)
{
Console::WriteLine(x);
}
Язык разметки ColdFusion (CFML)
[ редактировать ]Синтаксис скрипта
[ редактировать ]// arrays
arrayeach([1,2,3,4,5], function(v){
writeOutput(v);
});
// or
for (v in [1,2,3,4,5]){
writeOutput(v);
}
// or
// (Railo only; not supported in ColdFusion)
letters = ["a","b","c","d","e"];
letters.each(function(v){
writeOutput(v); // abcde
});
// structs
for (k in collection){
writeOutput(collection[k]);
}
// or
structEach(collection, function(k,v){
writeOutput("key: #k#, value: #v#;");
});
// or
// (Railo only; not supported in ColdFusion)
collection.each(function(k,v){
writeOutput("key: #k#, value: #v#;");
});
Синтаксис тегов
[ редактировать ]<!--- arrays --->
<cfloop index="v" array="#['a','b','c','d','e']#">
<cfoutput>#v#</cfoutput><!--- a b c d e --->
</cfloop>
CFML неправильно идентифицирует значение как «индекс» в этой конструкции; тот index
переменная получает фактическое значение элемента массива, а не его индекс.
<!--- structs --->
<cfloop item="k" collection="#collection#">
<cfoutput>#collection[k]#</cfoutput>
</cfloop>
Общий Лисп
[ редактировать ]Common Lisp предоставляет возможность foreach либо с помощью макроса dolist :
(dolist (i '(1 3 5 6 8 10 14 17))
(print i))
или мощный макрос цикла для обработки большего количества типов данных
(loop for 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) {
// do something to item
}
или
foreach(argument) {
// pass value
}
Дарт
[ редактировать ]for (final element in someCollection) {
// do something with element
}
Объектный Паскаль, Делфи
[ редактировать ]Поддержка Foreach была добавлена в Delphi 2005 и использует переменную перечислителя, которую необходимо объявить в разделе var .
for enumerator in collection do
begin
//do something here
end;
Эйфелева
[ редактировать ]Итерационная форма (foreach) конструкции Эйфелева цикла вводится ключевым словом across
.
В этом примере каждый элемент структуры my_list
печатается:
across my_list as ic loop print (ic.item) end
Местная организация ic
является экземпляром класса библиотеки ITERATION_CURSOR
. Функция курсора item
обеспечивает доступ к каждому элементу структуры. Потомки класса ITERATION_CURSOR
может быть создан для обработки специализированных итерационных алгоритмов. Типы объектов, которые можно перебирать ( my_list
в примере) основаны на классах, наследуемых от класса библиотеки ITERABLE
.
Итерационная форма Эйфелевого цикла также может использоваться как логическое выражение, когда ключевое слово loop
заменяется либо all
(осуществляющий универсальную количественную оценку ) или some
(влияет на экзистенциальную количественную оценку ).
Эта итерация представляет собой логическое выражение, которое истинно, если все элементы в my_list
имеют счет больше трех:
across my_list as ic all ic.item.count > 3 end
Следующее верно, если хотя бы один элемент имеет счетчик больше трех:
across my_list as ic some ic.item.count > 3 end
Идти
[ редактировать ]Цикл foreach в Go можно использовать для перебора массива, среза, строки, карты или канала.
Использование формы с двумя значениями позволяет получить индекс/ключ (первый элемент) и значение (второй элемент):
for index, value := range someCollection {
// Do something to index and value
}
Использование формы с одним значением позволяет получить индекс/ключ (первый элемент):
for index := range someCollection {
// Do something to index
}
классный
[ редактировать ]Groovy поддерживает циклы по коллекциям, таким как массивы, списки и диапазоны:
def x = [1,2,3,4]
for (v in x) // loop over the 4-element array x
{
println v
}
for (v in [1,2,3,4]) // loop over 4-element literal list
{
println v
}
for (v in 1..4) // loop over the range 1..4
{
println v
}
Groovy также поддерживает цикл for в стиле C с индексом массива:
for (i = 0; i < x.size(); i++)
{
println x[i]
}
Коллекции в Groovy также можно перебирать, используя каждое ключевое слово. и закрытие. По умолчанию шаблон цикла называется
x.each{ println it } // print every element of the x array
x.each{i-> println i} // equivalent to line above, only loop dummy explicitly named "i"
Хаскелл
[ редактировать ]Haskell позволяет перебирать списки с помощью монадических действий, используя mapM_
и forM_
( mapM_
с перевернутыми аргументами) из Control.Monad :
код | принты |
---|---|
mapM_ print [1..4]
|
1 2 3 4 |
forM_ "test" $ \char -> do
putChar char
putChar char
|
tteesstt |
Также возможно обобщить эти функции для работы с аппликативными функторами, а не с монадами и любой структурой данных, которую можно пройти с помощью traverse
( for
с перевернутыми аргументами) и mapM
( forM
с перевернутыми аргументами) из Data.Traversable .
Смешанный
[ редактировать ]for (value in iterable) {
trace(value);
}
Lambda.iter(iterable, function(value) trace(value));
Ява
[ редактировать ]В Java конструкция foreach была представлена в Java Development Kit (JDK) 1.5.0. [ 14 ]
Официальные источники используют несколько названий конструкции. Он называется «Расширенный цикл цикла». [ 14 ] «Цикл для каждого», [ 15 ] и «оператор foreach». [ 16 ] [ 17 ] : 264
for (Type item : iterableCollection) {
// Do something to item
}
Java также предоставляет API потока, начиная с Java 8: [ 17 ] : 294–203
List<Integer> intList = List.of(1, 2, 3, 4);
intList.stream().forEach(i -> System.out.println(i));
JavaScript
[ редактировать ]Стандарт ECMAScript 6 имеет for..of
для итерации без индекса по генераторам, массивам и многому другому:
for (var item of array){
// Do stuff
}
Альтернативно, стиль, основанный на функциях: [ 18 ]
array.forEach(item => {
// Do stuff
})
Для неупорядоченной итерации по ключам в объекте в JavaScript имеется функция for...in
петля:
for (var key in object) {
// Do stuff with object[key]
}
Чтобы ограничить итерацию собственными свойствами объекта, исключая те, которые унаследованы через цепочку прототипов, иногда полезно добавить тест hasOwnProperty(), если он поддерживается движком JavaScript (для WebKit/Safari это означает «в версии 3 или более поздней версии»). ").
for (var key in object) {
if (object.hasOwnProperty(key)) {
// Do stuff with object[key]
}
}
ECMAScript 5 предоставил метод Object.keys для передачи собственных ключей объекта в массив. [ 19 ]
var book = { name: "A Christmas Carol", author: "Charles Dickens" };
for(var key of Object.keys(book)){
alert("PropertyName = " key + " Property Value = " + book[key]);
}
Два
[ редактировать ]Источник: [ 20 ]
Выполняйте итерацию только по числовым значениям индекса:
for index, value in ipairs(array) do
-- do something
end
Перебрать все значения индекса:
for index, value in pairs(array) do
-- do something
end
Математика
[ редактировать ]В Математике Do
просто оценит выражение для каждого элемента списка, не возвращая никакого значения.
In[]:= Do[doSomethingWithItem, {item, list}]
Чаще используют Table
, который возвращает результат каждой оценки в новом списке.
In[]:= list = {3, 4, 5};
In[]:= Table[item^2, {item, list}]
Out[]= {9, 16, 25}
МАТЛАБ
[ редактировать ]for item = array
%do something
end
Как
[ редактировать ]В Mint поддерживаются циклы foreach, имеющие следующий синтаксис:
for each element of list
/* 'Do something.' */
end
The for (;;)
или while (true)
бесконечный цикл
в Mint можно написать с использованием цикла foreach и бесконечно длинного списка . [ 21 ]
import type
/* 'This function is mapped to'
* 'each index number i of the'
* 'infinitely long list.'
*/
sub identity(x)
return x
end
/* 'The following creates the list'
* '[0, 1, 2, 3, 4, 5, ..., infinity]'
*/
infiniteList = list(identity)
for each element of infiniteList
/* 'Do something forever.' */
end
Цель-C
[ редактировать ]Циклы Foreach, называемые быстрым перечислением , поддерживаются начиная с Objective-C 2.0. Их можно использовать для перебора любого объекта, реализующего протокол NSFastEnumeration, включая NSArray, NSDictionary (перебирает ключи), NSSet и т. д.
NSArray *a = [NSArray new]; // Any container class can be substituted
for(id obj in a) { // Dynamic typing is used. The type of object stored
// in 'a' can be unknown. The array can hold many different
// types of object.
printf("%s\n", [[obj description] UTF8String]); // Must use UTF8String with %s
NSLog(@"%@", obj); // Leave as an object
}
NSArrays также может транслировать сообщение своим членам:
NSArray *a = [NSArray new];
[a makeObjectsPerformSelector:@selector(printDescription)];
Если блоки доступны, NSArray может автоматически блокировать каждый содержащийся элемент:
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"obj %@", obj);
if ([obj shouldStopIterationNow])
*stop = YES;
}];
Тип итерируемой коллекции будет определять элемент, возвращаемый при каждой итерации. Например:
NSDictionary *d = [NSDictionary new];
for(id key in d) {
NSObject *obj = [d objectForKey:key]; // We use the (unique) key to access the (possibly nonunique) object.
NSLog(@"%@", obj);
}
OCaml
[ редактировать ]OCaml — функциональный язык программирования . Таким образом, эквивалент цикла foreach можно реализовать как библиотечную функцию над списками и массивами.
Для списков:
List.iter (fun x -> print_int x) [1;2;3;4];;
или короче:
List.iter print_int [1;2;3;4];;
Для массивов:
Array.iter (fun x -> print_int x) [|1;2;3;4|];;
или короче:
Array.iter print_int [|1;2;3;4|];;
ПараСейл
[ редактировать ]Язык параллельного программирования ParaSail поддерживает несколько типов итераторов, включая общий итератор «для каждого» над контейнером:
var Con : Container<Element_Type> := ...
// ...
for each Elem of Con concurrent loop // loop may also be "forward" or "reverse" or unordered (the default)
// ... do something with 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
// ... do something with Str or Tr
end loop
Паскаль
[ редактировать ]В языке Pascal стандарт ISO 10206:1990 ввел итерацию по заданным типам , таким образом:
var
elt: ElementType;
eltset: set of ElementType;
{...}
for elt in eltset do
{ ... do something with elt }
Перл
[ редактировать ]В Perl foreach . (эквивалент более короткого for) может использоваться для обхода элементов списка Выражение, обозначающее коллекцию для цикла, оценивается в контексте списка, и каждому элементу результирующего списка, в свою очередь, присваивается псевдоним переменной цикла.
Перечислите буквальный пример:
foreach (1, 2, 3, 4) {
print $_;
}
Примеры массивов:
foreach (@arr) {
print $_;
}
foreach $x (@arr) { #$x is the element in @arr
print $x;
}
Пример хеша:
foreach $x (keys %hash) {
print $x . " = " . $hash{$x}; # $x is a key in %hash and $hash{$x} is its value
}
Прямая модификация членов коллекции:
@arr = ( 'remove-foo', 'remove-bar' );
foreach $x (@arr){
$x =~ s/remove-//;
}
# Now @arr = ('foo', 'bar');
PHP
[ редактировать ]foreach ($set as $value) {
// Do something to $value;
}
Также возможно извлечь как ключи, так и значения, используя альтернативный синтаксис:
foreach ($set as $key => $value) {
echo "{$key} has a value of {$value}";
}
Прямая модификация членов коллекции:
$arr = array(1, 2, 3);
foreach ($arr as &$value) { // The &, $value is a reference to the original value inside $arr
$value++;
}
// Now $arr = array(2, 3, 4);
// also works with the full syntax
foreach ($arr as $key => &$value) {
$value++;
}
Питон
[ редактировать ]for item in iterable_collection:
# Do something with item
Назначение кортежа в Python, полностью доступное в цикле foreach, также упрощает перебор пар (ключ, значение) в ассоциативных массивах :
for key, value in some_dict.items(): # Direct iteration on a dict iterates on its keys
# Do stuff
Как for ... in
— единственный вид цикла for в Python, эквивалент цикла «счетчик» в других языках — это...
for i in range(len(seq)):
# Do something to seq[i]
... хотя и используя enumerate
функция считается более «Pythonic»:
for i, item in enumerate(seq):
# Do stuff with item
# Possibly assign it back to seq[i]
Р
[ редактировать ]for (item in object) {
# Do something with item
}
Как for ... in
это единственный вид for
цикл в R, эквивалент цикла «счетчик» в других языках:
for (i in seq_along(object)) {
# Do something with object[[i]]
}
Ракетка
[ редактировать ](for ([item set])
(do-something-with item))
или используя традиционную схему for-each
функция:
(for-each do-something-with a-list)
do-something-with
является функцией с одним аргументом.
Раку
[ редактировать ]В Raku , родственном языку Perl, for должен использоваться для обхода элементов списка ( foreach не разрешен). Выражение, обозначающее коллекцию для цикла, оценивается в контексте списка, но не выравнивается по умолчанию, и каждый элемент результирующего списка, в свою очередь, присваивается псевдониму переменной(ов) цикла.
Перечислите буквальный пример:
for 1..4 {
.say;
}
Примеры массивов:
for @arr {
.say;
}
Цикл for в форме модификатора оператора:
.say for @arr;
for @arr -> $x {
say $x;
}
for @arr -> $x, $y { # more than one item at a time
say "$x, $y";
}
Пример хеша:
for keys %hash -> $key {
say "$key: $hash{$key}";
}
или
for %hash.kv -> $key, $value {
say "$key: $value";
}
или
for %hash -> $x {
say "$x.key(): $x.value()"; # Parentheses needed to inline in double quoted string
}
Прямая модификация членов коллекции с помощью двойного заостренного блока <-> :
my @arr = 1,2,3;
for @arr <-> $x {
$x *= 2;
}
# Now @arr = 2,4,6;
Руби
[ редактировать ]set.each do |item|
# do something to item
end
или
for item in set
# do something to item
end
Это также можно использовать с хешем.
set.each do |key,value|
# do something to key
# do something to value
end
Ржавчина
[ редактировать ]The for
цикл имеет структуру for <pattern> in <expression> { /* optional statements */ }
. Он неявно вызывает IntoIterator::into_iter
метод для выражения и использует полученное значение, которое должно реализовать Iterator
черта. Если выражение само по себе является итератором, оно используется непосредственно for
пройти через реализацию IntoIterator
для всех Iterator
s , который возвращает итератор без изменений. Цикл вызывает Iterator::next
метод на итераторе перед выполнением тела цикла. Если Iterator::next
возвращает Some(_)
, значение внутри присваивается шаблону и выполняется тело цикла; если он вернется None
, цикл завершается.
let mut numbers = vec![1, 2, 3];
// Immutable reference:
for number in &numbers { // calls IntoIterator::into_iter(&numbers)
println!("{}", number);
}
for square in numbers.iter().map(|x| x * x) { // numbers.iter().map(|x| x * x) implements Iterator
println!("{}", square);
}
// Mutable reference:
for number in &mut numbers { // calls IntoIterator::into_iter(&mut numbers)
*number *= 2;
}
// prints "[2, 4, 6]":
println!("{:?}", numbers);
// Consumes the Vec and creates an Iterator:
for number in numbers { // calls IntoIterator::into_iter(numbers)
// ...
}
// Errors with "borrow of moved value":
// println!("{:?}", numbers);
Скала
[ редактировать ]// return list of modified elements
items map { x => doSomething(x) }
items map multiplyByTwo
for {x <- items} yield doSomething(x)
for {x <- items} yield multiplyByTwo(x)
// return nothing, just perform action
items foreach { x => doSomething(x) }
items foreach println
for {x <- items} doSomething(x)
for {x <- items} println(x)
// pattern matching example in for-comprehension
for ((key, value) <- someMap) println(s"$key -> $value")
Схема
[ редактировать ](for-each do-something-with a-list)
do-something-with
является функцией с одним аргументом.
Смолток
[ редактировать ]collection do: [:item| "do something to item" ]
Быстрый
[ редактировать ]Свифт использует for
… in
конструкция для перебора элементов коллекции. [ 22 ]
for thing in someCollection {
// do something with thing
}
The for
… in
Цикл часто используется с конструкциями закрытого и полуоткрытого диапазона для повторения тела цикла определенное количество раз.
for i in 0..<10 {
// 0..<10 constructs a half-open range, so the loop body
// is repeated for i = 0, i = 1, …, i = 9.
}
for i in 0...10 {
// 0...10 constructs a closed range, so the loop body
// is repeated for i = 0, i = 1, …, i = 9, i = 10.
}
СистемаVerilog
[ редактировать ]SystemVerilog поддерживает итерацию по любому типу вектора или массива любой размерности, используя foreach
ключевое слово.
Тривиальный пример перебирает массив целых чисел:
код | принты |
---|---|
int array_1d[] = '{ 3, 2, 1, 0 };
foreach array_1d[index]
$display("array_1d[%0d]: %0d", index, array_1d[index]);
|
array_1d[0]: 3 array_1d[1]: 2 array_1d[2]: 1 array_1d[3]: 0 |
Более сложный пример перебирает ассоциативный массив массивов целых чисел:
код | принты |
---|---|
int array_2d[string][] = '{ "tens": '{ 10, 11 },
"twenties": '{ 20, 21 } };
foreach array_2d[key,index]
$display("array_2d[%s,%0d]: %0d", key, index, array_2d[key,index]);
|
array_2d[tens,0]: 10 array_2d[tens,1]: 11 array_2d[twenties,0]: 20 array_2d[twenties,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 a 2 b 3 c |
Визуальный Бейсик (.NET)
[ редактировать ]For Each item In enumerable
' Do something with item.
Next
или без вывода типа
For Each item As type In enumerable
' Do something with item.
Next
Окна
[ редактировать ]Обычный командный процессор
[ редактировать ]Вызвать гипотетический frob
команду три раза, каждый раз присваивая ей название цвета.
C:\>FOR %%a IN ( red green blue ) DO frob %%a
Windows PowerShell
[ редактировать ]foreach ($item in $set) {
# Do something to $item
}
Из трубопровода
$list | ForEach-Object {Write-Host $_}
# or using the aliases
$list | foreach {write $_}
$list | % {write $_}
XSLT
[ редактировать ] <xsl:for-each select="set">
<!-- do something for the elements in <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 г.
- ^ Jump up to: а б «Улучшено для цикла — эта новая языковая конструкция[...]» «Язык программирования Java, раздел: Улучшения в JDK 5» . Сан Микросистемс, Инк. 2004 г. Проверено 26 мая 2009 г.
- ^ «Цикл для каждого» «Цикл для каждого» . Сан Микросистемс, Инк. 2008 г. Проверено 10 мая 2009 г.
- ^ «Реализация этого интерфейса позволяет объекту быть целью оператора foreach». «Итерируемый (платформа Java SE 6)» . Сан Микросистемс, Инк. 2004 г. Проверено 12 мая 2009 г.
- ^ Jump up to: а б Блох, Джошуа (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 .