stringtranslate.com

bucle para cada uno

Los bucles foreach casi siempre se utilizan para iterar sobre elementos en una secuencia de elementos.

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.

Sintaxis

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

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 , 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 3.0

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

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 ;  

C

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)

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

C#

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

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 fores 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 beginy 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' ; } }                       

C++/CLI

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

Lenguaje de marcado ColdFusion (CFML)

Sintaxis de secuencia de comandos

// 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# ;" ); });

Sintaxis de etiquetas

<!--- 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 indexvariable 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>

ceceo común

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

D

foreach ( elemento ; conjunto ) { // hacer algo con el elemento }   

o

foreach ( argumento ) { // pasar valor }  

Dardo

for ( elemento final en alguna colección ) { // hacer algo con el elemento }      

Objeto Pascal, Delfos

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 ;     

eiffel

La forma de iteración (foreach) de la construcción del bucle Eiffel se introduce mediante la palabra clave across.

my_listEn 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 ices una instancia de la clase de biblioteca ITERATION_CURSOR. La función del cursor itemproporciona acceso a cada elemento de la estructura. ITERATION_CURSORSe pueden crear descendientes de clase para manejar algoritmos de iteración especializados. Los tipos de objetos que se pueden iterar ( my_listen 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 loopse 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_listtienen 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        

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

maravilloso

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

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( forcon sus argumentos invertidos) y mapM( forMcon sus argumentos invertidos) de Data.Traversable.

Hax

for ( valor en iterable ) { trace ( valor ); }     Lambada . iter ( iterable , función ( valor ) traza ( valor ));  

Java

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

javascript

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...inbucle:

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

lua

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

Matemáticas

En Mathematica , Dosimplemente 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 }      

MATLAB

para elemento = matriz % hacer algo final   

menta

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           

C objetivo

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

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

Paravelismo

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  

Pascal

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}     

perla

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

PHP

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

Pitón

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 ... ines 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 enumeratefunción se considera más "Pythonic":

para  i ,  elemento  en  enumerar ( seq ):  # Hacer cosas con el elemento  # Posiblemente asignarlo nuevamente a seq[i]

R

for ( elemento en objeto ) { # Hacer algo con el elemento }    

Como for ... ines el único tipo de forbucle 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]] }    

Raqueta

( para ([ conjunto de elementos ]) ( hacer algo con el elemento ))    

o usando la for-eachfunción de esquema convencional:

( para-cada- hacer-algo-con -una-lista )  

do-something-withes una función de un argumento.

rakú

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;

Rubí

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    

Óxido

El forbucle 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 */ }forIterator::nextIterator::nextSome(_)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);

escala

// 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 " )     

Esquema

( para-cada- hacer-algo-con -una-lista )  

do-something-withes una función de un argumento.

Charla

colección  hacer: [ : artículo |  "hacer algo al artículo" ]

Rápido

Swift usa la construcción for... inpara iterar sobre los miembros de una colección. [22]

para algo en alguna colección { // hacer algo con algo }     

El bucle for... inse 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. }      

SistemaVerilog

SystemVerilog admite la iteración sobre cualquier tipo de vector o matriz de cualquier dimensionalidad utilizando la foreachpalabra 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

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 ise asumen valores secuenciales de la primera lista y jvalores secuenciales de la segunda lista:

Visual Basic (.NET)

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       

ventanas

Procesador de comandos convencional

Invoca un comando hipotético frobtres veces, dándole un nombre de color cada vez.

C:\> FOR  %% a IN  ( rojo verde azul )  DO frob %% a

WindowsPowerShell

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 $_ }

XSLT

 <xsl:for-each select= "set" > <!-- hacer algo para los elementos en <set> --> </xsl:for-each>   

[23]

Ver también

Referencias

  1. ^ "Lenguaje de programación D para cada documentación de declaración". Marte digital . Consultado el 4 de agosto de 2008 .
  2. ^ "SWI-Prolog - foreach/2". Swi-prolog.org . Consultado el 10 de febrero de 2020 .
  3. ^ "Rebol".
  4. ^ "Lenguaje de programación rojo".
  5. ^ "Cuarta edición de ECMAScript propuesta: descripción general del lenguaje" (PDF) . Consultado el 21 de febrero de 2020 .
  6. ^ "para cada uno... en" . Consultado el 21 de febrero de 2020 .
  7. ^ "para... en" . Consultado el 21 de febrero de 2020 .
  8. ^ "Características de C++ 11 en Visual C++ 11 - Blog del equipo de Visual C++ - Inicio del sitio - Blogs de MSDN". Blogs.msdn.com. 2011-09-12 . Consultado el 4 de agosto de 2013 .
  9. ^ "Bucle for basado en rango (desde C++ 11)". es.cppreference.com . Consultado el 3 de diciembre de 2018 .
  10. ^ "std::for_each - cppreferencia". es.cppreference.com . Consultado el 30 de septiembre de 2017 .
  11. ^ "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 .
  12. ^ Eric Niebler (31 de enero de 2013). "Capítulo 9. Boost.Foreach - 1.53.0". Boost.org . Consultado el 4 de agosto de 2013 .
  13. ^ "Cláusula de alcance". La especificación del lenguaje de programación Go . El lenguaje de programación Go . Consultado el 20 de octubre de 2013 .
  14. ^ ab "Bucle for mejorado: 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 .
  15. ^ "El bucle para cada uno" "El bucle para cada uno". Sun Microsystems, Inc. 2008 . Consultado el 10 de mayo de 2009 .
  16. ^ "La implementación de esta interfaz permite que un objeto sea el objetivo de la declaración" foreach ".""Iterable (Plataforma Java SE 6)". Sun Microsystems, Inc. 2004 . Consultado el 12 de mayo de 2009 .
  17. ^ ab Bloch, Joshua (2018). "Java efectivo: Guía del lenguaje de programación" (tercera ed.). Addison-Wesley. ISBN 978-0134685991.
  18. ^ "Array.prototype.forEach() - JavaScript | MDN". 16 de diciembre de 2023.
  19. ^ "Claves de objeto". Red de desarrolladores de Mozilla . Consultado el 7 de mayo de 2014 .
  20. ^ "Programación/Tablas Lua - Wikilibros, libros abiertos para un mundo abierto". es.wikibooks.org . Consultado el 6 de diciembre de 2017 .
  21. ^ Chu, Oliver. "Tutorial de menta" . Consultado el 20 de octubre de 2013 .
  22. ^ "Control Flow: el lenguaje de programación Swift (Swift 5.5)".
  23. ^ "Elemento XSLT <xsl:para-cada>". W3Schools.com .