La cláusula FOR EACH que Harbour incorporó al lenguaje CA-Clipper fue una gran mejora, pero hay mucha gente que sólo lo utiliza de su forma más básica:
FOR EACH value IN aValues
? value
NEXT
Sin embargo ofrece multitud de posibilidades. Vamos a enumerar unas cuantas:
- Iterar sobre más de una variable:
FOR EACH a, b, c IN aVal, cVal, hVal
? a, b, c
NEXT
- Establecer orden descendente:
FOR EACH a IN aVal DESCEND
? a
NEXT
- Asignar caracteres de una cadena de forma directa: (atención a la @)
s := "abcdefghijk"
FOR EACH c IN @s
IF c $ "aei"
c := Upper( c )
ENDIF
NEXT
? s // AbcdEfghIjk
- Control por POO sobre las variables de iterador:
- :__enumIndex() retorna el actual ordinal en la iteración. El equivalente a nFor
- :__enumIsFirst() retorna si es el primer elemento en la iteración
- :__enumIsLast() retorna si es el último elemento en la iteración
- :__enumBase() retorna la variable base que está siendo procesada. Útil cuando se procesan más de una variable.
- :__enumValue() retorna el valor de la variable que está siendo procesada. Útil cuando se procesan más de una variable.
FOR EACH a IN aVal
? a:__enumIndex()
NEX
Harbour incluso permite modificar como se debe de recorrer la iteración utilizando los métodos :__enumStart(), :__enumSkip() y :__EnumStop(). Tenéis un ejemplo de uso en el fichero \harbour\tests\foreach2.prg.
Espero que os haya sido de utilidad.
Un saludo
Pués si que tiene jugo el for each. Varios de estas posibilidades las desconocía. Muchas gracias maestro
Buenos días, desconocía por completo estas funcionalidades.
Gracias, un abrazo