Foreach loop (o para cada ciclo ) es una declaración de flujo de control para atravesar elementos en una colección . Foreach se usa generalmente en lugar de una declaración estándar de bucle for . Sin embargo, a diferencia de otras construcciones de bucle for, los bucles foreach [1] generalmente no mantienen un contador explícito: esencialmente dicen "haz esto con todo en este conjunto", en lugar de "haz esto x veces". Esto evita posibles errores uno a uno y hace que el código sea más sencillo de leer. En los lenguajes orientados a objetos, un iterador , incluso si está implícito, se utiliza a menudo como medio de recorrido.
La instrucción foreach en algunos idiomas tiene un orden definido, procesando cada elemento de la colección desde el primero hasta el último. La instrucción foreach en muchos otros lenguajes, especialmente en los lenguajes de programación de matrices , no tiene ningún orden en particular. Esto simplifica la optimización del bucle en general y, en particular, permite el procesamiento vectorial de elementos de la colección al mismo tiempo.
Sintaxis
La sintaxis varía según los idiomas. La mayoría usa la palabra simple for
, aproximadamente de la siguiente manera:
para cada artículo de la colección: hacer algo para el artículo
Ayuda de idioma
Los lenguajes de programación que admiten bucles foreach incluyen ABC , ActionScript , Ada , C ++ 11 , C # , ColdFusion Markup Language (CFML), Cobra , D , Daplex (lenguaje de consulta), Delphi , ECMAScript , Erlang , Java (desde 1.5), JavaScript , Lua , Objective-C (desde 2.0), ParaSail , Perl , PHP , Prolog , [2] Python , REALbasic , Rebol , [3] Red , [4] Ruby , Scala , Smalltalk , Swift , Tcl , tcsh , shells de Unix , Visual Basic .NET y Windows PowerShell . Los lenguajes notables sin foreach son C y C ++ pre-C ++ 11.
ActionScript 3.0
ActionScript es compatible con el estándar ECMAScript 4.0 [5] para for each .. in
[6], que extrae el valor de cada índice.
var foo : Object = { "manzana" : 1 , "naranja" : 2 };para cada ( valor de var : int in foo ) { trace ( valor ); } // devuelve "1" y luego "2"
También es compatible con for .. in
[7] que tira de la clave en cada índice.
for ( var key : String in foo ) { trace ( key ); }// devuelve "manzana" y luego "naranja"
Ada
Ada admite bucles foreach como parte del bucle for normal . Digamos que X es una matriz :
for I in X ' Range loop X ( I ) : = Get_Next_Element ; ciclo final ;
Esta sintaxis se utiliza principalmente en matrices, pero también funcionará con otros tipos cuando se necesite una iteración completa.
Ada 2012 tiene bucles generalizados para bucles foreach en cualquier tipo de contenedor (matriz, listas, mapas ...):
para Obj de X bucle - Trabajo en Obj final de bucle ;
C
El lenguaje C no tiene colecciones ni construcciones foreach. Sin embargo, tiene varias estructuras de datos estándar que se pueden usar como colecciones, y foreach se puede hacer fácilmente con una macro .
Sin embargo, ocurren dos problemas obvios:
- La macro no es higiénica: declara una nueva variable en el ámbito existente que permanece después del ciclo.
- No se puede definir una macro para cada uno que funcione con diferentes tipos de colección (por ejemplo, matriz y lista vinculada) o que sea extensible a tipos de usuario.
Cadena C como una colección de char
#include / * para que cada macro vea una cadena como una colección de valores de caracteres * /#define foreach (ptrvar, strvar) \char * ptrvar; \para (ptrvar = strvar; (* ptrvar)! = '\ 0'; * ptrvar ++)int main ( int argc , char ** argv ) { char * s1 = "abcdefg" ; char * s2 = "123456789" ; foreach ( p1 , s1 ) { printf ( "bucle 1:% c \ n " , * p1 ); } foreach ( p2 , s2 ) { printf ( "bucle 2:% c \ n " , * p2 ); } return 0 ;}
C int matriz como una colección de int (tamaño de matriz conocido en tiempo de compilación)
#include / * macro foreach viendo una matriz de valores int como una colección de valores 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 ( "bucle 1:% d \ n " , * p1 ); } foreach ( p2 , a2 ) { printf ( "bucle 2:% d \ n " , * p2 ); } return 0 ;}
Más general: cadena o matriz como colección (tamaño de colección conocido en tiempo de ejecución)
- Nota:
idxtype
se puede quitar ytypeof(col[0])
usar en su lugar con GCC
#include #include / * para que cada macro vea una matriz de un tipo dado como una colección de valores de un tipo dado * /#define arraylen (arr) (sizeof (arr) / sizeof (arr [0]))#define foreach (idxtype, idxpvar, col, colsiz) \idxtype * idxpvar; \para (idxpvar = col; idxpvar <(col + colsiz); ++ idxpvar)int main ( int argc , char ** argv ) { char * c1 = "colección" ; int c2 [] = { 3 , 1 , 4 , 1 , 5 , 9 }; doble * c3 ; int c3len = 4 ; c3 = ( doble * ) calloc ( c3len , sizeof ( doble )); c3 [ 0 ] = 1,2 ; c3 [ 1 ] = 3,4 ; c3 [ 2 ] = 5,6 ; c3 [ 3 ] = 7,8 ; foreach ( char , p1 , c1 , strlen ( c1 )) { printf ( "bucle 1:% c \ n " , * p1 ); } foreach ( int , p2 , c2 , arraylen ( c2 )) { printf ( "bucle 2:% d \ n " , * p2 ); } foreach ( doble , p3 , c3 , c3len ) { printf ( "bucle 3:% .1lf \ n " , * p3 ); } return 0 ;}
C#
En C # , asumiendo que myArray es una matriz de enteros:
foreach ( int x en myArray ) { Console . WriteLine ( x ); }
Language Integrated Query (LINQ) proporciona la siguiente sintaxis, aceptando una expresión delegada o lambda :
myArray . ToList (). ParaCada ( x => Consola . WriteLine ( x ));
C ++
C ++ 11 proporciona un bucle foreach. La sintaxis es similar a la de Java :
#include int main () { int myint [] = { 1 , 2 , 3 , 4 , 5 }; for ( int i : myint ) { std :: cout << i << '\ n' ; } }
Las declaraciones for basadas en rangos de C ++ 11 se han implementado en GNU Compiler Collection (GCC) (desde la versión 4.6), Clang (desde la versión 3.0) y Visual C ++ 2012 (versión 11 [8] )
El rango basado en azúcar sintácticofor
es equivalente a:
for ( auto __anon = begin ( myint ); __anon ! = end ( myint ); ++ __anon ) { auto i = * __anon ; std :: cout << i << '\ n' ; }
El compilador usa una búsqueda dependiente de argumentos para resolver las funciones begin
y end
. [9]
La biblioteca estándar de C ++ también admite for_each
, [10] que aplica cada elemento a una función, que puede ser cualquier función predefinida o una expresión lambda. Si bien el rango basado en es solo desde el principio hasta el final, el rango y la dirección en los que puede cambiar la dirección o el rango alterando los dos primeros parámetros.
#include #include // contiene std :: for_each#include int main () { estándar :: vector < int > v { 1 , 2 , 3 , 4 , 5 }; std :: for_each ( v . begin (), v . end (), [ & ] ( int i ) { std :: cout << i << '\ n' ; }); std :: cout << "invertido pero omitir 2 elementos: \ n " ; std :: for_each ( v . rbegin () + 2 , v . rend (), [ & ] ( int i ) { std :: cout << i << '\ n' ; }); }
Qt , un marco C ++, ofrece una macro que proporciona bucles foreach [11] utilizando la interfaz de iterador STL:
#include #include int main () { QList < int > lista ; lista << 1 << 2 << 3 << 4 << 5 ; foreach ( int i , lista ) { qDebug () << i ; } }
Boost , un conjunto de bibliotecas de C ++ portátiles gratuitas revisadas por pares también proporciona bucles foreach: [12]
#include #include int main () { int myint [] = { 1 , 2 , 3 , 4 , 5 }; BOOST_FOREACH ( int Y i , Myint ) { std :: cout << i << '\ n' ; } }
C ++ / CLI
El lenguaje C ++ / CLI propone una construcción similar a C #.
Suponiendo que myArray es una matriz de enteros:
para cada ( int x en myArray ) { Console :: WriteLine ( x ); }
Lenguaje de marcado ColdFusion (CFML)
Sintaxis de la secuencia de comandos
// matrices arrayeach ([ 1 , 2 , 3 , 4 , 5 ], function ( v ) { writeOutput ( v ); });// opara ( v en [ 1 , 2 , 3 , 4 , 5 ]) { writeOutput ( v ); }// o// (Solo Railo; no compatible con ColdFusion) letras = [ "a" , "b" , "c" , "d" , "e" ]; letters.each ( función ( v ) { writeOutput ( v ); // abcde });// estructuras para ( k en la colección ) { writeOutput ( colección [ k ]); }// ostructEach ( colección , función ( k , v ) { writeOutput ( "clave: # k # , valor: # v # ;" ); });// o // (solo Railo; no compatible con ColdFusion) collection.each ( function ( k , v ) { writeOutput ( "clave: # k # , valor: # v # ;" ); });
Sintaxis de la etiqueta
index = "v" matriz = " # ['a', 'b', 'c', 'd', 'e'] # " > # v #
CFML identifica incorrectamente el valor como "índice" en esta construcción; la index
variable recibe el valor real del elemento de la matriz, no su índice.
item = "k" colección = " # colección # " > # colección [ k ] #
Lisp común
Common Lisp proporciona la habilidad foreach con la macro dolist :
( dolist ( i ' ( 1 3 5 6 8 10 14 17 )) ( imprimir i ))
o la poderosa macro de bucle para iterar en más tipos de datos
( bucle para i en ' ( 1 3 5 6 8 10 14 17 ) hacer ( imprimir i ))
e incluso con la función mapcar :
( mapcar # ' imprimir ' ( 1 3 5 6 8 10 14 17 ))
D
foreach ( elemento ; conjunto ) { // hacer algo con el elemento } o foreach ( argumento ) { // pasar valor }
Dardo
for ( elemento final en someCollection ) { // hacer algo con el elemento }
Objeto Pascal, Delphi
La compatibilidad con Foreach se agregó en Delphi 2005 y utiliza una variable enumeradora que debe declararse en la sección var .
para el enumerador en la colección , comience // haga algo aquí, finalice ;
Eiffel
La forma de iteración (foreach) de la construcción de bucle Eiffel es introducida por la palabra clave across
.
En este ejemplo, my_list
se imprimen todos los elementos de la estructura :
a través de my_list como ic loop print ( ic . item ) end
La entidad local ic
es una instancia de la clase de biblioteca ITERATION_CURSOR
. La función del cursor item
proporciona acceso a cada elemento de la estructura. ITERATION_CURSOR
Se pueden crear descendientes de clase para manejar algoritmos de iteración especializados. Los tipos de objetos que se pueden iterar ( my_list
en el ejemplo) se basan en clases que heredan de la clase de biblioteca ITERABLE
.
La forma de iteración del bucle Eiffel también se puede usar como una expresión booleana cuando la palabra clave loop
se reemplaza por all
(efectuando cuantificación universal ) o some
(efectuando cuantificación existencial ).
Esta iteración es una expresión booleana que es verdadera si todos los elementos de my_list
tienen recuentos superiores a tres:
a través de my_list como ic all ic . artículo . contar > 3 fin
Lo siguiente es cierto si al menos un elemento tiene un recuento superior a tres:
a través de my_list como ic some ic . artículo . contar > 3 fin
Ir
El bucle foreach de Go se puede utilizar para recorrer una matriz, un segmento, una cadena, un mapa o un canal.
Usando la forma de dos valores, obtenemos el índice / clave (primer elemento) y el valor (segundo elemento):
for index , value : = range someCollection { // Hacer algo para indexar y valorar }
Usando la forma de un valor, obtenemos el índice / clave (primer elemento):
for index : = range someCollection { // Hacer algo para indexar }
[13]
Groovy
Groovy soportes para bucles más colecciones como arrays, listas y rangos:
def x = [ 1 , 2 , 3 , 4 ] for ( v en x ) // recorrer la matriz de 4 elementos x { println v }for ( v en [ 1 , 2 , 3 , 4 ]) // recorrer la lista literal de 4 elementos { println v }for ( v en 1 .. 4 ) // bucle sobre el rango 1..4 { println v }
Groovy también admite un bucle for estilo C con un índice de matriz:
para ( i = 0 ; i < x . tamaño (); i ++) { println x [ i ] }
Las colecciones en Groovy también se pueden iterar usando cada palabra clave y un cierre. Por defecto, el muñeco se llama bucle se
x . each { println it } // imprime cada elemento de la matriz x x . cada { i -> println i } // equivalente a la línea anterior, solo el bucle ficticio explícitamente llamado "i"
Haskell
Haskell permite recorrer listas con acciones monádicas usando mapM_
y forM_
( mapM_
con sus argumentos invertidos) de Control.Monad :
código | huellas dactilares |
---|---|
mapM_ imprimir [ 1 .. 4 ] | 1234 |
forM_ "prueba" $ \ char -> do putChar char putChar char | tteesstt |
También es posible generalizar esas funciones para trabajar en functores aplicativos en lugar de mónadas y cualquier estructura de datos que se pueda atravesar usando traverse
( for
con sus argumentos invertidos) y mapM
( forM
con sus argumentos invertidos) de Data.Traversable .
Haxe
for ( valor en iterable ) { rastreo ( valor ); }Lambda . iter ( iterable , función ( valor ) seguimiento ( valor ));
Java
En Java , se introdujo una construcción foreach en Java Development Kit (JDK) 1.5.0. [14]
Las fuentes oficiales usan varios nombres para la construcción. Se lo conoce como "Enhanced for Loop", [14] el "For-Each Loop", [15] y la "instrucción foreach". [dieciséis]
for ( Type item : iterableCollection ) { // Hacer algo con el elemento }
JavaScript
El estándar EcmaScript 6 tiene for..of
una iteración sin índice sobre generadores, matrices y más:
for ( var item of array ) { // Hacer cosas }
Alternativamente, estilo basado en funciones: [17]
matriz . forEach ( item => { // Hacer cosas })
Para la iteración desordenada sobre las claves en un objeto, JavaScript presenta el for...in
ciclo:
for ( var clave en el objeto ) { // Hacer cosas con el objeto [clave] }
Para limitar la iteración a las propiedades propias del objeto, excluyendo las heredadas a través de la cadena de prototipos, a veces es útil agregar una prueba hasOwnProperty (), si es compatible con el motor JavaScript (para WebKit / Safari, esto significa "en la versión 3 o posterior ").
for ( var clave en el objeto ) { if ( objeto . hasOwnProperty ( clave )) { // Hacer cosas con el objeto [clave] } }
ECMAScript 5 proporcionó el método Object.keys, para transferir las propias claves de un objeto a una matriz. [18]
var book = { nombre : "Cuento de Navidad" , autor : "Charles Dickens" }; for ( clave var del objeto . claves ( libro )) { alerta ( "NombrePropiedad =" clave + "Valor de propiedad =" + libro [ clave ]); }
Lua [19]
Iterar solo a través de valores de índice numérico:
para índice , valor en ipairs ( matriz ) hacer - hacer algo al final
Iterar a través de todos los valores de índice:
para índice , valor en pares ( matriz ) hacer - hacer algo final
Mathematica
En Mathematica , Do
simplemente evaluará una expresión para cada elemento de una lista, sin devolver ningún valor.
En [] : = Do [ doSomethingWithItem , { item , list }]
Es más común de usar Table
, que devuelve el resultado de cada evaluación en una nueva lista.
En [] : = lista = { 3 , 4 , 5 }; En [] : = Tabla [ elemento ^ 2 , { elemento , lista }] Fuera [] = { 9 , 16 , 25 }
MATLAB
para item = array %hacer algofinal
menta
Para cada bucle se admiten en Mint, que poseen la siguiente sintaxis:
para cada elemento de la lista / * 'Hacer algo'. * / fin
El bucle infinitofor (;;)
o en Mint se puede escribir usando un para cada bucle y una lista infinitamente larga . [20]while (true)
import type / * 'Esta función se asigna a' * 'cada número de índice i de la' * 'lista infinitamente larga.' * / sub identidad ( x ) return x end / * 'Lo siguiente crea la lista' * '[0, 1, 2, 3, 4, 5, ..., infinito]' * / infiniteList = lista ( identidad ) para cada elemento de infiniteList / * 'Hacer algo para siempre'. * / fin
C objetivo
Los bucles Foreach, denominados enumeración rápida , se admiten a partir de Objective-C 2.0. Se pueden usar para iterar sobre cualquier objeto que implemente el protocolo NSFastEnumeration, incluidos NSArray, NSDictionary (itera sobre claves), NSSet, etc.
NSArray * a = [ NSArray nuevo ]; // Se puede sustituir cualquier clase de contenedorfor ( id obj in a ) { // Note la tipificación dinámica (no necesitamos saber el // Tipo de objeto almacenado en 'a'. De hecho, puede haber // muchos tipos diferentes de objeto en la matriz. printf ( "% s \ n " , [[ descripción obj ] UTF8String ]); // Debe usar UTF8String con% s NSLog ( @ "% @" , obj ); // Dejar como objeto }
Los NSArrays también pueden transmitir un mensaje a sus miembros:
NSArray * a = [ NSArray nuevo ];[ a makeObjectsPerformSelector : @selector ( printDescription )];
Cuando hay bloques disponibles, un NSArray puede realizar automáticamente un bloqueo en cada elemento contenido:
[ myArray enumerateObjectsUsingBlock : ^ ( id obj , NSUInteger idx , BOOL * stop ) { NSLog ( @ "obj% @" , obj ); if ([ obj shouldStopIterationNow ]) * stop = YES ; }];
El tipo de colección que se itera determinará el elemento devuelto con cada iteración. Por ejemplo:
NSDictionary * d = [ NSDictionary nuevo ];for ( clave de identificación en d ) { NSObject * obj = [ d objectForKey : key ]; // Usamos la clave (única) para acceder al objeto (posiblemente no único). NSLog ( @ "% @" , obj ); }
OCaml
OCaml es un lenguaje funcional . Por lo tanto, el equivalente de un bucle foreach se puede lograr como una función de biblioteca sobre listas y matrices.
Para listas:
Lista . iter ( divertido x -> print_int x ) [ 1 ; 2 ; 3 ; 4 ] ;;
o en resumen:
Lista . iter print_int [ 1 ; 2 ; 3 ; 4 ] ;;
Para matrices:
Array . iter ( divertido x -> print_int x ) [| 1 ; 2 ; 3 ; 4 |] ;;
o en resumen:
Array . iter print_int [| 1 ; 2 ; 3 ; 4 |] ;;
Parasail
El lenguaje de programación paralelo ParaSail admite varios tipos de iteradores, incluido un iterador general "para cada" sobre un contenedor:
var Con : Recipiente < ELEMENT_TYPE > : = .. . // ... para cada bucle concurrente de Elem of Con // el bucle también puede ser "hacia adelante" o "inverso" o desordenado (por defecto) // ... hacer algo con Elem end loop
ParaSail también admite filtros en iteradores y la capacidad de hacer referencia tanto a la clave como al valor de un mapa. Aquí hay una iteración hacia adelante sobre los elementos de "My_Map" seleccionando solo elementos donde las claves están en "My_Set":
var My_Map : Mapa < Key_Type => Univ_String , VALUE_TYPE => árbol < Entero >> : = .. . const My_Set : Establecer < Univ_String > : = [ "abc" , "def" , "ghi" ];para cada [ Str => Tr ] de My_Map { Str en My_Set } bucle hacia adelante // ... haz algo con Str o Tr end loop
Pascal
En Pascal , la norma ISO 10206: 1990 introdujo la iteración sobre los tipos de conjuntos , así:
var elt : ElementType ; eltset : conjunto de ElementType ;{...}para elt en eltset hacer {... hacer algo con elt}
Perl
En Perl , foreach (que es equivalente al más corto para) se puede usar para recorrer elementos de una lista. La expresión que denota la colección a recorrer se evalúa en contexto de lista y cada elemento de la lista resultante, a su vez, tiene un alias de la variable de bucle.
Ejemplo de lista literal:
foreach ( 1 , 2 , 3 , 4 ) { imprimir $ _ ; }
Ejemplos de matrices:
foreach ( @arr ) { imprimir $ _ ; }
foreach $ x ( @arr ) { # $ x es el elemento en @arr print $ x ; }
Ejemplo de hash:
foreach $ x ( claves % hash ) { imprimir $ x . "=" . $ hash { $ x }; # $ x es una clave en% hash y $ hash {$ x} es su valor }
Modificación directa de miembros de la colección:
@arr = ( 'eliminar-foo' , 'eliminar-barra' ); foreach $ x ( @arr ) { $ x = ~ s / eliminar - // ; } # Ahora @arr = ('foo', 'bar');
PHP
foreach ( $ establecido como $ valor ) { // Hacer algo con $ valor; }
También es posible extraer tanto claves como valores usando la sintaxis alternativa:
foreach ( $ establecido como $ clave => $ valor ) { echo " { $ clave } tiene un valor de { $ valor } " ; }
Modificación directa de miembros de la colección:
$ arr = matriz ( 1 , 2 , 3 ); foreach ( $ arr as & $ value ) { // Note que &, $ value es una referencia al valor original dentro de $ arr $ value ++ ; } // Ahora $ arr = array (2, 3, 4);// también funciona con la sintaxis completa foreach ( $ arr as $ key => & $ value ) { $ value ++ ; }
- Más información
Pitón
para el artículo en iterable_collection : # Hacer algo con el artículo
La asignación de tuplas de Python, completamente disponible en su bucle foreach, también hace que sea trivial iterar en pares (clave, valor) en matrices asociativas :
para clave , valor en some_dict . items (): # iteración directa en un dictado itera en sus claves # hacer cosas
Como for ... in
es el único tipo de bucle for en Python, el equivalente al bucle "contador" que se encuentra en otros lenguajes es ...
for i in range ( len ( seq )): # Hacer algo para seq [i]
... aunque usar la enumerate
función se considera más "Pythonic":
para i , elemento en enumerar ( seq ): # Hacer cosas con el elemento # Posiblemente asignarlo de nuevo a seq [i]
Raqueta
( para ([ conjunto de elementos ]) ( hacer-algo-con el elemento ))
o usando la for-each
función Scheme convencional :
( para-cada- hacer-algo-con -una-lista )
do-something-with
es una función de un argumento.
Raku
En Raku , una lengua hermana para Perl, para debe ser utilizado para atravesar los elementos de una lista ( foreach no está permitido). La expresión que denota la colección sobre la que se repite se evalúa en el contexto de lista, pero no se aplana de forma predeterminada, y cada elemento de la lista resultante, a su vez, tiene un alias de las variables de bucle.
Ejemplo de lista literal:
por 1 .. 4 { . decir ;}
Ejemplos de matrices:
para @arr { . decir ;}
El bucle for en su forma de modificador de declaración:
. decir por @arr ;
para @arr -> $ x { digamos $ x ;}
para @arr -> $ x , $ y { # más de un elemento a la vez, diga "$ x, $ y" ;}
Ejemplo de hash:
para claves % hash -> $ clave { diga "$ clave: $ hash {$ clave}" ;}
o
para % hash . kv -> $ clave , $ valor { decir "$ clave: $ valor" ;}
o
para % hash -> $ x { decir "$ x.key (): $ x.value ()" ; # Se necesitan paréntesis para insertarlos en una cadena entre comillas dobles}
Modificación directa de los miembros de la colección con un bloque doblemente puntiagudo, <-> :
mi @arr = 1 , 2 , 3 ;para @arr <-> $ x { $ x * = 2 ;}# Ahora @arr = 2,4,6;
Rubí
conjunto . cada uno hace | artículo | # hacer algo al final del artículo
o
para el artículo en el conjunto # hacer algo al final del artículo
Esto también se puede usar con un hash.
conjunto . cada uno hace | artículo , valor | # hacer algo para el artículo # hacer algo para valorar el final
Oxido
El for
bucle tiene la estructura for
. Implícitamente llama al IntoIterator::into_itermétodo en la expresión y usa el valor resultante, que debe implementar el Iteratorrasgo. Si la expresión es en sí misma un iterador, el for
bucle la usa directamente a través de una implementación de IntoIteratorfor all Iterators que devuelve el iterador sin cambios. El bucle llama al Iterator::next
método en el iterador antes de ejecutar el cuerpo del bucle. Si Iterator::next
regresa Some(_)
, el valor dentro se asigna al patrón y se ejecuta el cuerpo del bucle; si regresa None
, el ciclo se termina.
deje mut numeros = vec! [ 1 , 2 , 3 ]; // Referencia inmutable: para número en & números { // llama a IntoIterator :: into_iter (& numbers) println! ( "{}" , número ); }para cuadrado en números . iter (). map ( | x | x * x ) { // numbers.iter (). map (| x | x * x) implementa Iterator println! ( "{}" , cuadrado ); }// Referencia mutable: para el número en & mut números { // llama a IntoIterator :: into_iter (& mut números) * número * = 2 ; }// imprime "[2, 4, 6]": println! ( "{:?}" , números ); // Consume el Vec y crea un Iterator: for number in numbers { // llama a IntoIterator :: into_iter (numbers) // ... } // Errores con "préstamo del valor movido": // println! ("{:?}", números);
Scala
// lista de regreso de los elementos modificados artículos se asignan { x => doSomething ( x ) } elementos mapa multiplyByTwopara { x <- items } produce doSomething ( x ) para { x <- items } produce multiplyByTwo ( x )// devuelve nada, sólo realizar la acción artículos foreach { x => doSomething ( x ) } artículos foreach printlnpara { x <- artículos } doSomething ( x ) para { x <- artículos } println ( x )// ejemplo de coincidencia de patrones en la comprensión para (( clave , valor ) <- someMap ) println ( s " $ clave -> $ valor " )
Esquema
( para-cada- hacer-algo-con -una-lista )
do-something-with
es una función de un argumento.
Charla
colección hacer: [ : artículo | "hacer algo con el artículo" ]
Rápido
Swift usa la construcción for
… in
para iterar sobre los miembros de una colección. [21]
for thing in someCollection { // hacer algo con algo }
El bucle for
... in
se usa a menudo con las construcciones de rango cerrado y semiabierto para iterar sobre el cuerpo del bucle un cierto número de veces.
para i en 0 .. < 10 { // 0 .. <10 construye un rango semiabierto, por lo que el cuerpo del bucle // se repite para i = 0, i = 1,…, i = 9. }para i en 0 .. .10 { // 0 ... 10 construye un rango cerrado, por lo que el cuerpo del bucle // se repite para i = 0, i = 1,…, i = 9, i = 10. }
SystemVerilog
SystemVerilog admite la iteración sobre cualquier vector o tipo de matriz de cualquier dimensionalidad utilizando la foreach
palabra clave.
Un ejemplo trivial itera sobre una matriz de números enteros:
código | huellas dactilares |
---|---|
int array_1d [] = '{ 3 , 2 , 1 , 0 };foreach matriz_1d [ índice ] $ display ( "matriz_1d [% 0d]:% 0d" , índice , matriz_1d [ índice ]); | array_1d [0]: 3array_1d [1]: 2array_1d [2]: 1array_1d [3]: 0 |
Un ejemplo más complejo itera sobre una matriz asociativa de matrices de enteros:
código | huellas dactilares |
---|---|
int array_2d [ string ] [] = '{ "decenas" : ' { 10 , 11 }, "veinte" : '{ 20 , 21 } };foreach matriz_2d [ clave , índice ] $ display ( "matriz_2d [% s,% 0d]:% 0d" , clave , índice , matriz_2d [ clave , índice ]); | array_2d [decenas, 0]: 10array_2d [decenas, 1]: 11array_2d [veinte, 0]: 20array_2d [veinte, 1]: 21 |
Tcl
Tcl usa foreach para iterar sobre listas. Es posible especificar más de una variable de iterador, en cuyo caso se les asignan valores secuenciales de la lista.
código | huellas dactilares |
---|---|
foreach { i j } { 1 2 3 4 5 6 } { pone "$ i $ j" } | 1 23 45 6 |
También es posible iterar sobre más de una lista simultáneamente. En lo siguiente se i
asumen valores secuenciales de la primera lista, j
valores secuenciales de la segunda lista:
código | huellas dactilares |
---|---|
foreach i { 1 2 3 } j { a bc } { pone "$ i $ j" } | 1 a2 b3 c |
Visual Basic .NET
Para cada elemento En enumerable 'Hacer algo con el elemento. próximo
o sin inferencia de tipos
Para cada elemento Como escriba En enumerable 'Hacer algo con el elemento. próximo
Ventanas
Procesador de comando convencional
Invoque un frob
comando hipotético tres veces, dándole un nombre de color cada vez.
C: \> FOR %% a IN ( rojo verde azul ) DO frob %% a
Windows PowerShell
foreach ( $ item in $ set ) { # Hacer algo con $ item }
De una tubería
$ lista | ForEach -Object { Write-Host $ _ }# o usando los alias $ list | foreach { escribir $ _ } $ lista | % { escribe $ _ }
XSLT
select = "set" > ->
[22]
Ver también
- Hacer mientras bucle
- En bucle
- Mientras bucle
- Mapa (función de orden superior)
Referencias
- ^ " foreachDocumentación de declaración de lenguaje de programación D " . Marte digital . Consultado el 4 de agosto de 2008 .
- ^ "SWI-Prolog - foreach / 2" . www.swi-prolog.org . Consultado el 10 de febrero de 2020 .
- ^ http://www.rebol.com . Falta o vacío
|title=
( ayuda ) - ^ http://www.red-lang.org . Falta o vacío
|title=
( ayuda ) - ^ "Propuesta 4ª edición de ECMAScript - Descripción general del idioma" (PDF) . Consultado el 21 de febrero de 2020 .
- ^ "para cada ... en" . Consultado el 21 de febrero de 2020 .
- ^ "para..en" . Consultado el 21 de febrero de 2020 .
- ^ "Funciones de C ++ 11 en Visual C ++ 11 - Blog del equipo de Visual C ++ - Página principal del sitio - Blogs de MSDN" . Blogs.msdn.com. 2011-09-12 . Consultado el 4 de agosto de 2013 .
- ^ "Bucle for basado en rango (desde C ++ 11)" . en.cppreference.com . Consultado el 3 de diciembre de 2018 .
- ^ "std :: for_each - cppreference" . en.cppreference.com . Consultado el 30 de septiembre de 2017 .
- ^ "Qt 4.2: Contenedores genéricos" . Doc.qt.digia.com. Archivado desde el original el 23 de noviembre de 2015 . Consultado el 4 de agosto de 2013 .
- ^ Eric Niebler (31 de enero de 2013). "Capítulo 9. Boost.Foreach - 1.53.0" . Boost.org . Consultado el 4 de agosto de 2013 .
- ^ "Cláusula de rango" . La especificación del lenguaje de programación Go . El lenguaje de programación Go . Consultado el 20 de octubre de 2013 .
- ^ a b "Mejorado para bucle: esta nueva construcción de lenguaje [...]" "Lenguaje de programación Java, sección: Mejoras en JDK 5" . Sun Microsystems, Inc. 2004 . Consultado el 26 de mayo de 2009 .
- ^ "El bucle para cada uno" "El bucle para cada uno" . Sun Microsystems, Inc. 2008 . Consultado el 10 de mayo de 2009 .
- ^ "La implementación de esta interfaz permite que un objeto sea el objetivo de la declaración" foreach "". "Iterable (Java Platform SE 6)" . Sun Microsystems, Inc. 2004 . Consultado el 12 de mayo de 2009 .
- ^ [1]
- ^ "Object.keys" . Red de desarrolladores de Mozilla . Consultado el 7 de mayo de 2014 .
- ^ "Lua Programming / Tables - Wikilibros, libros abiertos para un mundo abierto" . en.wikibooks.org . Consultado el 6 de diciembre de 2017 .
- ^ Chu, Oliver. "Tutorial de menta" . Consultado el 20 de octubre de 2013 .
- ^ https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/ControlFlow.html#//apple_ref/doc/uid/TP40014097-CH9-XID_153
- ^ "XSLT elemento" . W3Schools.com .