closures

Closures: respuesta a Vekman

Enviado por clbustos el Vie, 01/08/2008 - 11:49.
Clasificado en:

Leyendo el comentario de Venkman, debo reconocer que tiene razón en que el ejemplo que utilicé en el artículo era de funciones anónimas y no de un closure propiamente tal.

Para entender la diferencia, les pido que lean el interesante artículo Blocks and Closures in Ruby, donde el autor de Ruby nos habla sobre ambas estructuras. Leyendo con atención, llegué al siguiente ejemplo operacional en Ruby que puede ser útil para ver como funciona una closure:

  1.  def ciclo(colores)
  2.   x=-1
  3.   return Proc.new {
  4.   x=(x+1) % colores.size
  5.   colores[x]
  6.   }
  7.  end
  8.  closure=ciclo(%w{rojo azul negro})
  9.  1.upto(10) {|i|
  10.   puts closure.call
  11.  }

La salida en

rojo
azul
negro
rojo
azul
negro
rojo
azul
negro
rojo

Como se podrán dar cuenta, la función ciclo devuelve un procedimiento, dentro del cual se mantienen las variables colores y x. Cada vez que se llama el Proc, ahora convertido en closure, x se incremente en uno y nos entrega el elemento del array que corresponde.

Distribuir contenido