Jump to content

Цикл foreach

(Перенаправлено из расширенного цикла for )
Циклы 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;
}

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

idxtype можно удалить и typeof(col[0]) используется вместо GCC
#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';
  }
}

Язык 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
}

[ 13 ]

классный

[ редактировать ]

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));

Стандарт 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

Циклы 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 функциональный язык программирования . Таким образом, эквивалент цикла 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');
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 для всех Iterators , который возвращает итератор без изменений. Цикл вызывает 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" ]

Свифт использует forin конструкция для перебора элементов коллекции. [ 22 ]

for thing in someCollection {
    // do something with thing
}

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

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 $_}
 <xsl:for-each select="set">
   <!-- do something for the elements in <set> -->
 </xsl:for-each>

[ 23 ]

См. также

[ редактировать ]
  1. ^ «Язык программирования D» foreach Документация заявления» . Digital Mars . Проверено г. 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. ^ Jump up to: а б «Улучшено для цикла — эта новая языковая конструкция[...]» «Язык программирования Java, раздел: Улучшения в JDK 5» . Сан Микросистемс, Инк. 2004 г. Проверено 26 мая 2009 г.
  15. ^ «Цикл для каждого» «Цикл для каждого» . Сан Микросистемс, Инк. 2008 г. Проверено 10 мая 2009 г.
  16. ^ «Реализация этого интерфейса позволяет объекту быть целью оператора foreach». «Итерируемый (платформа Java SE 6)» . Сан Микросистемс, Инк. 2004 г. Проверено 12 мая 2009 г.
  17. ^ Jump up to: а б Блох, Джошуа (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 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c5ffe38c4037caa41809b421a918d49a__1725422640
URL1:https://arc.ask3.ru/arc/aa/c5/9a/c5ffe38c4037caa41809b421a918d49a.html
Заголовок, (Title) документа по адресу, URL1:
Foreach loop - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)