~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 5EE02E6A13D3CB0E8041E3DCE6D0C69B__1708405800 ✰
Заголовок документа оригинал.:
✰ Foreach loop - Wikipedia ✰
Заголовок документа перевод.:
✰ Цикл foreach — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Foreach_loop ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/5e/9b/5ee02e6a13d3cb0e8041e3dce6d0c69b.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/5e/9b/5ee02e6a13d3cb0e8041e3dce6d0c69b__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 13:23:39 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 20 February 2024, at 08:10 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Цикл foreach — Википедия Jump to content

Цикл foreach

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

В компьютерном программировании цикл 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  );  
  } 

 // возвращает «яблоко», затем «апельсин» 

Есть [ править ]

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

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

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

[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 :

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

Смолток [ править ]

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

Свифт [ править ]

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

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

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

для   меня   в   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> 

[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. ^ Перейти обратно: а б «Улучшено для цикла — эта новая языковая конструкция[...]» «Язык программирования Java, раздел: Улучшения в JDK 5» . Сан Микросистемс, Инк. г. 2004 Проверено 26 мая 2009 г.
  15. ^ «Цикл для каждого» «Цикл для каждого» . Сан Микросистемс, Инк. г. 2008 Проверено 10 мая 2009 г.
  16. ^ «Реализация этого интерфейса позволяет объекту быть целью оператора foreach». «Итерируемый (платформа Java SE 6)» . Сан Микросистемс, Инк. г. 2004 Проверено 12 мая 2009 г.
  17. ^ Перейти обратно: а б Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN  978-0134685991 .
  18. ^ «Array.prototype.forEach() — JavaScript | MDN» . 16 декабря 2023 г.
  19. ^ «Объект.ключи» . Сеть разработчиков Mozilla . Проверено 7 мая 2014 г.
  20. ^ «Программирование на Lua/таблицы — Wikibooks, открытые книги для открытого мира» . ru.wikibooks.org . Проверено 6 декабря 2017 г.
  21. ^ Чу, Оливер. «Урок по мяте» . Проверено 20 октября 2013 г.
  22. ^ «Поток управления — язык программирования Swift (Swift 5.5)» .
  23. ^ «Элемент XSLT <xsl:for-each>» . W3Schools.com .
Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 5EE02E6A13D3CB0E8041E3DCE6D0C69B__1708405800
URL1:https://en.wikipedia.org/wiki/Foreach_loop
Заголовок, (Title) документа по адресу, URL1:
Foreach loop - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)