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