Forum: Rails-ES OT: Una duda de Ruby no de RoR

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9410c6499d12e519a1541bca778f54d9?d=identicon&s=25 Reynier Perez Mira (Guest)
on 2009-02-17 18:03
(Received via mailing list)
Buenas a todos:
Primero que todo mis disculpas a la lista de RoR por realizar una
pregunta de Ruby en la misma pero no conozco alguna lista en castellano
de Ruby (si alguien la conoce y me lo dice sería perfecto ;) ). Estoy
leyendo el libro "Programming Ruby, 2nd Edition" y me ha surgido una
duda. Observen la definición del método siguiente:

class File
  def File.open_and_process(*args)
    f = File.open(*args)
    yield f
    f.close()
  end
end

Y aquí su llamada:

File.open_and_process("testfile", "r") do |file|
  while line = file.gets
    puts line
  end
end

La duda mía es la siguiente: ¿por qué el uso de yield f? No entiendo el
porque de yield en ese contexto.

Un saludo y a la espera de sus respuestas
Ing. Reynier Pérez Mira
Dirección Técnica IP
Fc3f12c165eaeac4999bc274215fb582?d=identicon&s=25 Roberto m. Oliva (roliva)
on 2009-02-17 18:27
(Received via mailing list)
Una respuesta rápida sería porque, desde la función llamante te puedes
olvidar de cerrar el fichero. La utilizacion del do ... end te asegura
utilizar el fichero dentro de su ámbito de apertura y cierre.

Espero que te ayude

Un saludo
Roberto M. Oliva

Reynier Perez Mira
escribió:> Buenas a todos:
Cfcd2c33fd69fd8ab1a897a40bda4144?d=identicon&s=25 Efrén José Fuentes Romero (Guest)
on 2009-02-18 01:08
(Received via mailing list)
En verdad la clase File lo que esta encapsulando es la apertura y el
cierre del archivo,
el yield en ese contexto puede ser sustituido por cualquier
procedimiento que tu le ordenes
en tu caso solo estas mostrando la linea, pero el proceso puede ser
tan complejo como quieras.

File.open_and_process("entrada", "r") do |entrada|
  File.open_and_process("salida", "w") do |salida|
    while linea = entrada.gets
      linea = linea.reverse!
      salida.puts linea
    end
  end
end

El 17/02/2009, a las 12:32 p.m., Reynier Perez Mira
escribió:
> Buenas a todos:
9410c6499d12e519a1541bca778f54d9?d=identicon&s=25 Reynier Perez Mira (Guest)
on 2009-02-18 03:47
(Received via mailing list)
>       salida.puts linea
>     end
>   end
> end

Si pero tengo entendido que el "yield" lo que hace es repetir la
acción. Por ejemplo si pongo:

def  funcion_ok(arg)
  yield
  yield
end

Y luego llamo

puts funcion("Pepe") me da como salida:

Pepe
Pepe

Eso fue lo que entendí del uso de "yield" ¿me estoy equivocando?

Un saludo
Ing. Reynier Pérez Mira
Dirección Técnica IP
D5bef118c1f829a613ae66d8f0a8e899?d=identicon&s=25 Yoandy Rodriguez Martinez (Guest)
on 2009-02-18 04:46
(Received via mailing list)
Yield lo que hace es ejecutar el bloque que hayas pasado como parámetro
(algo parecido al value de Smalltalk) con el yield en ese ejemplo
permites que a tu método se le pueda pasar un parámetro de tipo bloque (o
como se le diga en Ruby). Un poquito más de esto lo puedes ver
investigando acerca de clausuras (closures)
http://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica)


-----Mensaje original-----
De: ror-es-bounces@lists.simplelogica.net
[mailto:ror-es-bounces@lists.simplelogica.net] En nombre de Reynier
Perez Mira
Enviado el: Tuesday, February 17, 2009 9:47 PM
Para: La lista sobre Ruby On Rails (rubyonrails.com) en castellano
Asunto: Re: [Ror-es] OT: Una duda de Ruby no de RoR

>       salida.puts linea
>     end
>   end
> end

Si pero tengo entendido que el "yield" lo que hace es repetir la
acción. Por ejemplo si pongo:

def  funcion_ok(arg)
  yield
  yield
end

Y luego llamo

puts funcion("Pepe") me da como salida:

Pepe
Pepe

Eso fue lo que entendí del uso de "yield" ¿me estoy equivocando?

Un saludo
Ing. Reynier Pérez Mira
Dirección Técnica IP
_______________________________________________
Ror-es mailing list
Ror-es@lists.simplelogica.net
http://lists.simplelogica.net/mailman/listinfo/ror-es
This topic is locked and can not be replied to.