Цикл foreach

Цикл foreach — це оператор для обходу елементів у колекції. Foreach можна використовувати замість оператора циклу for. Однак, на відміну від циклу for, у циклах foreach зазвичай немає явного лічильника: він виконує зазначені в тілі дії для кожного елемента в наборі, а не заздалегідь визначену кількість разів. В об’єктно-орієнтованих мовах ітератор, навіть якщо він неявний, часто використовується як засіб обходу.

Синтаксис оператора foreach може відрізнятися залежно від мови програмування. Загалом він виглядає так:

для кожного елемента колекції:
    набір дій, які для поточнного елемента треба виконати

Мови програмування, котрі підтримують оператор foreach: ABC, ActionScript, Ada, C++11, C#, ColdFusion Markup Language (CFML), Cobra, D, Daplex (query language), Delphi, ECMAScript, Erlang, Java (since 1.5), JavaScript, Lua, Objective-C (since 2.0), ParaSail, Perl, PHP, Prolog, Python, REALbasic, Rebol, Red, Ruby, Scala, Smalltalk, Swift, Tcl, tcsh, Unix shells, Visual Basic .NET, and Windows PowerShell.

Цикл foreach у різних мовах

ActionScript 3.0


ActionScript підтримує стандарт ECMAScript 4.0 для for each .. in , котрий поміщає значення у кожний індекс.

var foo:Object = {
	"apple":1,
	"orange":2
};

for each (var value:int in foo) { 
	trace(value); 
}

// returns "1" then "2"

ActionScript підтримує також for .. in , котрий поміщає значення у кожний індекс.

for (var key:String in foo) { 
	trace(key); 
}

// повертає спочатку "apple" , потім "orange"

Ada


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

Мова C не має колекцій або конструкції foreach. Однак вона має кілька стандартних структур даних, які можна використовувати як колекції, а foreach можна легко створити за допомогою макросу.

Однак виникають дві очевидні проблеми:

  • Макрос оголошує нову змінну в існуючій області видимості, яка залишається після циклу.
  • Не можна визначити один макрос foreach, який працює з різними типами колекцій (наприклад, масив і зв’язаний список) або який можна розширити для типів користувачів.

Приклад коду на С, що працює як foreach:

#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#

У C#, припускаючи, що myArray є масивом цілих чисел:

foreach (int x in myArray) { Console.WriteLine(x); }

C++

C++11 підтримує цикл foreach. Синтаксис схожий на такий для Java:

#include <iostream>

int main()
{
  int myint[] = {1, 2, 3, 4, 5};

  for (int i : myint)
  {
    std::cout << i << '\n';
  }
}

Java

У Java конструкція foreach була представлена в Java Development Kit (JDK) 1.5.0.

Офіційні джерела використовують кілька назв для конструкції. Його називають «розширеним циклом for», «циклом For-Each» і «оператором foreach».

for (Type item : iterableCollection) {
    // Do something to item
}

JavaScript

Стандарт ECMAScript 6 має for..of для безіндексної ітерації по генераторах, масивах тощо:

for (var item of array){
    // Do stuff
}

Альтернативний функціональний стиль:

array.forEach(item => {
    // Do stuff
})

Для невпорядкованої ітерації за ключами в об’єкті JavaScript має цикл for...in :

for (var key in object) {
    // Do stuff with object[key]
}

Щоб обмежити ітерацію власними властивостями об’єкта, за винятком тих, які успадковуються через ланцюжок прототипів, іноді корисно додати тест hasOwnProperty(), якщо він підтримується механізмом JavaScript.

for (var key in object) {
    if (object.hasOwnProperty(key)) {
        // Do stuff with object[key]
    }
}

PHP

У мові програмування PHP конструкція foreach надає простий спосіб перебору масивів. foreach працює тільки з масивами та об'єктами, і генеруватиме помилку при спробі використання зі змінними інших типів або неініціалізованими змінними. Існує два види синтаксису:


1. З використанням лише значення:

foreach ($set as $value) {
    // Do something to $value;
}

2. З використанням ключа та значення:

foreach ($set as $key => $value) {
    echo "{$key} has a value of {$value}";
}

Python

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 є єдиним різновидом циклу в Python, еквівалентом циклу з параметром є

for i in range(len(seq)):
    # Do something to seq[i]

Вважається, що використання функції enumerate більш коректно для Python:

for i, item in enumerate(seq):
    # Do stuff with item
    # Possibly assign it back to seq[i]
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.