En programación de computadoras , el bucle foreach (o bucle for-each ) es una declaración de flujo de control para atravesar elementos en una colección . foreach generalmente se usa en lugar de una declaración de bucle for estándar . Sin embargo, a diferencia de otras construcciones de bucles 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 por uno y simplifica la lectura del código. En los lenguajes orientados a objetos , un iterador , incluso si está implícito, se utiliza a menudo como medio de recorrido.
La declaración foreach en algunos idiomas tiene un orden definido, procesando cada elemento de la colección desde el primero hasta el último. La declaración foreach en muchos otros lenguajes, especialmente 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.
La sintaxis varía entre idiomas. La mayoría usa la palabra simple for
, más o menos como sigue:
para cada artículo de la colección: hacer algo al artículo
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 , R , REALbasic , Rebol , [3] Red , [4] Ruby , Scala , Smalltalk , Swift , Tcl , tcsh , Shells Unix , Visual Basic (.NET) y Windows PowerShell . Los lenguajes notables sin foreach son C y C++ anteriores a C++11.
ActionScript admite el estándar ECMAScript 4.0 [5] para for each .. in
[6] , que extrae el valor de cada índice.
var foo : Objeto = { "manzana" : 1 , "naranja" : 2 }; para cada ( valor var : int en foo ) { trace ( valor ); } // devuelve "1" y luego "2"
También admite for .. in
[7] que extrae la clave en cada índice.
for ( clave var : cadena en foo ) { trace ( clave ); } // devuelve "manzana" y luego "naranja"
Ada admite bucles foreach como parte del bucle for normal . Digamos que X es una matriz :
for I in X ' Bucle de rango X ( I ) : = Get_Next_Element ; bucle final ;
Esta sintaxis se utiliza principalmente en matrices, pero también funcionará con otros tipos cuando se necesite una iteración completa.
Ada 2012 ha generalizado bucles para cada bucle en cualquier tipo de contenedor (matriz, listas, mapas...):
para Obj del bucle X - Trabajar en el bucle final Obj ;
El lenguaje C no tiene colecciones ni una construcción foreach. Sin embargo, tiene varias estructuras de datos estándar que se pueden usar como colecciones y foreach se puede crear fácilmente con una macro .
Sin embargo, ocurren dos problemas obvios:
Cadena C como una colección de caracteres.
#incluir <stdio.h> /* macro foreach que ve una cadena como una colección de valores de caracteres */#definir foreach(ptrvar, strvar) \char*ptrvar; \para (ptrvar = strvar; (*ptrvar) != '\0'; *ptrvar++)int principal ( int argc , char ** argv ) { char * s1 = "abcdefg" ; char * s2 = "123456789" ; para cada ( p1 , s1 ) { printf ( "bucle 1: %c \n " , * p1 ); } para cada uno ( p2 , s2 ) { printf ( "bucle 2: %c \n " , * p2 ); } devolver 0 ; }
C int array como una colección de int (tamaño de matriz conocido en tiempo de compilación)
#incluir <stdio.h> /* macro foreach que ve una matriz de valores int como una colección de valores int */#definir foreach(intpvar, intarr) \int* intpvar; \for (intpvar = intarr; intpvar < (intarr + (tamañode(intarr)/tamañode(intarr[0]))); ++intpvar)int principal ( int argc , char ** argv ) { int a1 [] = { 1 , 1 , 2 , 3 , 5 , 8 }; int a2 [] = { 3 , 1 , 4 , 1 , 5 , 9 }; para cada ( p1 , a1 ) { printf ( "bucle 1: %d \n " , * p1 ); } para cada ( p2 , a2 ) { printf ( "bucle 2: %d \n " , * p2 ); } devolver 0 ; }
Más general: cadena o matriz como colección (el tamaño de la colección se conoce en tiempo de ejecución)
idxtype
Se puede quitar y typeof(col[0])
usar en su lugar con GCC.#incluir <stdio.h> #incluir <cadena.h> /* macro foreach que ve una matriz de un tipo determinado como una colección de valores de un tipo determinado */#define arraylen(arr) (tamaño de(arr)/tamaño de(arr[0]))#definir foreach(idxtype, idxpvar, col, colsiz) \idxtipo* idxpvar; \para (idxpvar = col; idxpvar < (col + colsiz); ++idxpvar)int principal ( 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 , tamaño de ( 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 ); } devolver 0 ; }
En C# , suponiendo que myArray es una matriz de números enteros:
foreach ( int x en myArray ) { Consola . Línea de escritura ( x ); }
Language Integrated Query (LINQ) proporciona la siguiente sintaxis y acepta una expresión delegada o lambda :
mimatriz . Listar (). ForEach ( x => Consola . WriteLine ( x ));
C++ 11 proporciona un bucle foreach. La sintaxis es similar a la de Java:
#incluir <iostream> int principal () { int miint [] = { 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 azúcar sintáctico basado en rango for
es equivalente a:
for ( auto __anon = comenzar ( myint ); __anon ! = end ( myint ); ++ __anon ) { auto i = * __anon ; std :: cout << i << '\n' ; }
El compilador utiliza una búsqueda dependiente de argumentos para resolver las funciones begin
y end
. [9]
La biblioteca estándar de C++ también admite [10]for_each
, que aplica cada elemento a una función, que puede ser cualquier función predefinida o una expresión lambda. Si bien la función basada en rango es solo desde el principio hasta el final, el rango o la dirección se pueden cambiar modificando los dos primeros parámetros.
#include <iostream> #include <algoritmo> // contiene std::for_each #include <vector> int principal () { std :: vector < int > v { 1 , 2 , 3 , 4 , 5 }; std :: for_each ( v . comenzar (), v . terminar (), []( int i ) { std :: cout << i << '\n' ; }); std :: cout << "invertido pero omite 2 elementos: \n " ; std :: for_each ( v . rbegin () + 2 , v . rend (), []( int i ) { std :: cout << i << '\n' ; }); }
Qt , un marco de C++, ofrece una macro que proporciona bucles foreach [11] utilizando la interfaz de iterador STL:
#incluir <QList> #incluir <QDebug> int principal ( ) { QList <int> lista ; lista << 1 << 2 << 3 << 4 << 5 ; foreach ( int i , lista ) { qDebug () << i ; } }
Boost , un conjunto de bibliotecas C++ portátiles y revisadas por pares, también proporciona bucles 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' ; } }
El lenguaje C++/CLI propone una construcción similar a C#.
Suponiendo que myArray es una matriz de números enteros:
para cada ( int x en myArray ) { Consola :: WriteLine ( x ); }
// matrices arrayeach ([ 1 , 2 , 3 , 4 , 5 ], función ( v ) { writeOutput ( v ); });// opara ( v en [ 1 , 2 , 3 , 4 , 5 ]) { escribirSalida ( v ); }// o// (solo Railo; no compatible con ColdFusion) letras = [ "a" , "b" , "c" , "d" , "e" ]; letras.cada uno ( función ( v ){ escribirSalida ( 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# ;" ); });
<!--- arrays ---> <cfloop index = "v" array = " #['a','b','c','d','e']# " > <cfoutput> # v # </cfoutput> <!--- abcde ---> </cfloop>
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.
<!--- estructuras ---> <cfloop item = "k" colección = " #collection# " > <cfoutput> # colección [ k ]# </cfoutput> </cfloop>
Common Lisp proporciona la capacidad foreach con la macro dolist :
( dolista ( 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 :
( mapacar #' imprimir ' ( 1 3 5 6 8 10 14 17 ))
foreach ( elemento ; conjunto ) { // hacer algo con el elemento }
o
foreach ( argumento ) { // pasar valor }
for ( elemento final en alguna colección ) { // hacer algo con el elemento }
El soporte para 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 ;
La forma de iteración (foreach) de la construcción del bucle Eiffel se introduce mediante la palabra clave across
.
my_list
En este ejemplo, se imprime cada elemento de la estructura :
a través de my_list como ic loop print ( ic . item ) final
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 utilizar como expresión booleana cuando la palabra clave loop
se reemplaza por all
(lo que efectúa una cuantificación universal ) o some
(lo que efectúa una cuantificación existencial ).
Esta iteración es una expresión booleana que es verdadera si todos los elementos my_list
tienen recuentos superiores a tres:
a través de my_list como ic todo ic . artículo . cuenta > 3 fin
Lo siguiente es cierto si al menos un elemento tiene un recuento mayor que tres:
a través de my_list como ic algún ic . artículo . cuenta > 3 fin
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 se obtiene el índice/clave (primer elemento) y el valor (segundo elemento):
para índice , valor : = rango algunaColección { // Hacer algo para indexar y valorar }
Usando la forma de un valor se obtiene el índice/clave (primer elemento):
for index := range someCollection { // Haz algo para indexar }
[13]
Groovy admite bucles sobre colecciones como matrices, listas y rangos:
def x = [ 1 , 2 , 3 , 4 ] for ( v in x ) // recorre la matriz de 4 elementos x { println v } for ( v in [ 1 , 2 , 3 , 4 ]) // recorre la lista literal de 4 elementos { println v } for ( v in 1 .. 4 ) // recorre 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 utilizando cada palabra clave y un cierre. De forma predeterminada, el bucle ficticio se denomina así.
X . each { println it } // imprime cada elemento de la matriz x x . each { i -> println i } // equivalente a la línea anterior, solo el bucle ficticio se llama explícitamente "i"
Haskell permite recorrer listas con acciones monádicasmapM_
usando y forM_
( mapM_
con sus argumentos invertidos) desde Control.Monad:
También es posible generalizar esas funciones para que funcionen con functores aplicativos en lugar de mónadas y cualquier estructura de datos que sea transitable usando traverse
( for
con sus argumentos invertidos) y mapM
( forM
con sus argumentos invertidos) de Data.Traversable.
for ( valor en iterable ) { trace ( valor ); } Lambada . iter ( iterable , función ( valor ) traza ( valor ));
En Java , se introdujo una construcción foreach en el Java Development Kit (JDK) 1.5.0. [14]
Las fuentes oficiales utilizan varios nombres para la construcción. Se lo conoce como "bucle for mejorado", [14] "bucle For-Each", [15] y "declaración foreach". [16] [17] : 264
for ( Tipo de elemento : iterableCollection ) { // Hacer algo con el elemento }
Java también proporciona la API de flujo desde Java 8: [17] : 294–203
Lista <Entero> intList = Lista . de ( 1 , 2 , 3 , 4 ); listaint . arroyo (). forEach ( i -> Sistema . out . println ( i ));
El estándar ECMAScript 6for..of
permite iteraciones sin índice sobre generadores, matrices y más:
for ( var elemento de la matriz ){ // Hacer cosas }
Alternativamente, estilo basado en funciones: [18]
matriz . paraCada ( elemento => { // Hacer cosas })
Para iteraciones desordenadas sobre las claves de un objeto, JavaScript presenta el for...in
bucle:
for ( var clave en objeto ) { // Hacer cosas con objeto[clave] }
Para limitar la iteración a las propiedades propias del objeto, excluyendo aquellas heredadas a través de la cadena de prototipo, 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 objeto ) { if ( objeto . hasOwnProperty ( clave )) { // Hacer cosas con objeto[clave] } }
ECMAScript 5 proporcionó el método Object.keys para transferir las claves propias de un objeto a una matriz. [19]
var libro = { nombre : "Cuento de Navidad" , autor : "Charles Dickens" }; for ( clave var del objeto . claves ( libro )){ alerta ( "Nombre de propiedad = " clave + " Valor de propiedad = " + libro [ clave ]); }
Fuente: [20]
Iterar sólo a través de valores de índice numérico:
para índice , valor en ipairs ( matriz ) hacer - hacer algo final
Iterar a través de todos los valores del índice:
para índice , valor en pares ( matriz ) hacer - hacer algo final
En Mathematica , Do
simplemente evaluará una expresión para cada elemento de una lista, sin devolver ningún valor.
En [] := Hacer [ hacerAlgoConArtículo , { elemento , lista }]
Es más común utilizar 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 }
para elemento = matriz % hacer algo final
Los bucles For each son compatibles con Mint y poseen la siguiente sintaxis:
para cada elemento de la lista /* 'Hacer algo.' */ fin
El bucle infinitofor (;;)
o
en Mint se puede escribir usando un bucle para cada uno y una lista infinitamente larga . [21]while (true)
tipo de importación /* 'Esta función está asignada 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]' */ listainfinita = lista ( identidad ) para cada elemento de listainfinita /* 'Hacer algo para siempre.' */ fin
Los bucles Foreach, llamados enumeración rápida , se admiten a partir de Objective-C 2.0. Se pueden utilizar para iterar sobre cualquier objeto que implemente el protocolo NSFastEnumeration, incluidos NSArray, NSDictionary (itera sobre claves), NSSet, etc.
NSArray * a = [ NSArray nuevo ]; // Cualquier clase de contenedor puede ser sustituida for ( id obj in a ) { // Se utiliza escritura dinámica. El tipo de objeto almacenado // en 'a' puede ser desconocido. La matriz puede contener muchos // tipos diferentes de objetos. printf ( "%s \n " , [[ descripción del objeto ] UTF8String ]); // Debe usar UTF8String con %s NSLog ( @"%@" , obj ); // Dejar como objeto }
NSArrays también puede 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 bloque en cada elemento contenido:
[ myArray enumerateObjectsUsingBlock :^ ( id obj , NSUInteger idx , BOOL * stop ) { NSLog ( @"obj %@" , obj ); if ([ obj deberíaStopIterationNow ]) * detener = 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 : clave ]; // Usamos la clave (única) para acceder al objeto (posiblemente no único). NSLog ( @"%@" , obj ); }
OCaml es un lenguaje de programación funcional . Por lo tanto, se puede lograr el equivalente de un bucle foreach como una función de biblioteca sobre listas y matrices.
Para listas:
Lista . iter ( diversión x -> print_int x ) [ 1 ; 2 ; 3 ; 4 ];;
o en forma resumida:
Lista . iter print_int [ 1 ; 2 ; 3 ; 4 ];;
Para matrices:
Matriz . iter ( diversión x -> print_int x ) [| 1 ; 2 ; 3 ; 4 |];;
o en forma resumida:
Matriz . iter print_int [| 1 ; 2 ; 3 ; 4 |];;
El lenguaje de programación paralela ParaSail admite varios tipos de iteradores, incluido un iterador general "para cada" sobre un contenedor:
var Con : Contenedor <Tipo_elemento> : = .. . // ... para cada bucle concurrente de Elem de Con // el bucle también puede ser "adelante" o "inverso" o desordenado (el valor predeterminado) // ... haz algo con Elem final del bucle
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 directa sobre los elementos de "My_Map" seleccionando solo elementos donde las claves están en "My_Set":
var My_Map : Mapa < Tipo_clave => Cadena_Univ , Tipo_valor => Árbol < Entero >> := .. . const My_Set : Establecer < Univ_String > := [ "abc" , "def" , "ghi" ];para cada [ Str => Tr ] de My_Map { Str in My_Set } bucle directo // ... haz algo con Str o Tr end loop
En Pascal , la norma ISO 10206:1990 introdujo la iteración sobre tipos de conjuntos , así:
var elt : Tipo de elemento ; eltset : conjunto de ElementType ; {...}para elt en eltset hacer {... hacer algo con elt}
En Perl , foreach (que es equivalente al for más corto) se puede utilizar 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 tiene, a su vez, un alias de la variable del bucle.
Ejemplo literal de lista:
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-bar' ); foreach $x ( @arr ){ $x =~ s/remove-// ; } # Ahora @arr = ('foo', 'bar');
foreach ( $establecer como $valor ) { // Hacer algo con $valor; }
También es posible extraer claves y valores utilizando 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 ) { // El &, $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 ++ ; }
para el artículo en iterable_collection : # Haz algo con el artículo
La asignación de tuplas de Python, totalmente disponible en su bucle foreach, también hace que sea trivial iterar pares (clave, valor) en matrices asociativas :
para clave , valor en some_dict . items (): # La iteración directa en un dict 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...
para i en rango ( len ( seq )): # Haz 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 nuevamente a seq[i]
for ( elemento en objeto ) { # Hacer algo con el elemento }
Como for ... in
es el único tipo de for
bucle en R, el equivalente al bucle "contador" que se encuentra en otros lenguajes es...
for ( i in seq_along ( objeto )) { # Hacer algo con el objeto[[i]] }
( para ([ conjunto de elementos ]) ( hacer algo con el elemento ))
o usando la for-each
función de esquema convencional:
( para-cada- hacer-algo-con -una-lista )
do-something-with
es una función de un argumento.
En Raku , un lenguaje hermano de Perl, se debe utilizar for para recorrer elementos de una lista ( no se permite foreach ). La expresión que denota la colección a recorrer se evalúa en el contexto de la lista, pero no se aplana de forma predeterminada, y cada elemento de la lista resultante, a su vez, tiene un alias con las variables del bucle.
Ejemplo literal de lista:
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 { diga $x ;}
para @arr -> $x , $y { # más de un elemento a la vez, diga "$x, $y" ;}
Ejemplo de hash:
para claves %hash -> $key { diga "$key: $hash{$key}" ;}
o
para % hash . kv -> $clave , $valor { decir "$clave: $valor" ;}
o
para %hash -> $x { diga "$x.key(): $x.value()" ; # Se necesitan paréntesis para insertar en una cadena entre comillas dobles}
Modificación directa de 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;
colocar . cada uno hace | artículo | # hacer algo hasta el final del artículo
o
para el artículo en el conjunto # hacer algo hasta el final del artículo
Esto también se puede usar con un hash.
colocar . cada uno hace | clave , valor | # hacer algo para la clave # hacer algo para valorar el final
El for
bucle tiene la estructura . Implícitamente llama al método IntoIterator::into_iter en la expresión y utiliza el valor resultante, que debe implementar el rasgo Iterator. Si la expresión es en sí misma un iterador, el bucle la usa directamente a través de una implementación de IntoIterator para todos los iteradores que devuelve el iterador sin cambios. El bucle llama al método en el iterador antes de ejecutar el cuerpo del bucle. Si devuelve , el valor interno se asigna al patrón y se ejecuta el cuerpo del bucle; si devuelve , el ciclo finaliza.for <pattern> in <expression> { /* optional statements */ }
for
Iterator::next
Iterator::next
Some(_)
None
let mut números = vec! [ 1 , 2 , 3 ]; // Referencia inmutable: para números en & números { // llama a IntoIterator::into_iter(&numbers) println! ( "{}" , número ); } para cuadrado en números . iterador (). map ( | x | x * x ) { // números.iter().map(|x| x * x) implementa Iterador println! ( "{}" , cuadrado ); } // Referencia mutable: para 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 Vec y crea un Iterador: for número en números { // llama a IntoIterator::into_iter(números) // ... } // Errores con "préstamo de valor movido": // println!("{:?}", números);
// devuelve la lista de elementos modificados mapa de elementos { x => hacer algo ( x ) } mapa de elementos multiplicar por dos para { x <- elementos } rendimiento hacer algo ( x ) para { x <- elementos } rendimiento multiplicar por dos ( x ) // no devuelve nada, solo realiza elementos de acción para cada { x => hacer algo ( x ) } elementos para cada println para { x <- elementos } hacer algo ( x ) para { x <- elementos } println ( x ) // ejemplo de coincidencia de patrones en for-comprehension for (( clave , valor ) <- algúnMap ) println ( s" $ clave -> $ valor " )
( para-cada- hacer-algo-con -una-lista )
do-something-with
es una función de un argumento.
colección hacer: [ : artículo | "hacer algo al artículo" ]
Swift usa la construcción for
... in
para iterar sobre los miembros de una colección. [22]
para algo en alguna colección { // hacer algo con algo }
El bucle for
... in
se utiliza a menudo con construcciones de rango cerrado y medio abierto para iterar sobre el cuerpo del bucle un determinado número de veces.
para i en 0. . < 10 { // 0..<10 construye un rango medio abierto, 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 admite la iteración sobre cualquier tipo de vector o matriz de cualquier dimensionalidad utilizando la foreach
palabra clave.
Un ejemplo trivial itera sobre una matriz de números enteros:
Un ejemplo más complejo itera sobre una matriz asociativa de matrices de números enteros:
Tcl usa foreach para iterar sobre listas. Es posible especificar más de una variable iteradora, en cuyo caso se les asignan valores secuenciales de la lista.
También es posible iterar sobre más de una lista simultáneamente. A continuación i
se asumen valores secuenciales de la primera lista y j
valores secuenciales de la segunda lista:
Para cada elemento En enumerable 'Hacer algo con el elemento. Próximo
o sin inferencia de tipos
Para cada elemento Como tipo En enumerable 'Hacer algo con el elemento. Próximo
Invoca un comando hipotético frob
tres veces, dándole un nombre de color cada vez.
C:\> FOR %% a IN ( rojo verde azul ) DO frob %% a
foreach ( $elemento en $conjunto ) { # Hacer algo en $elemento }
De una tubería
$lista | Para cada -Objeto { Escribir-Host $_ }# o usando los alias $list | foreach { escribir $_ } $lista | % { escribir $_ }
<xsl:for-each select= "set" > <!-- hacer algo para los elementos en <set> --> </xsl:for-each>
[23]