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
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.
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 M.
escribió:
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)
-----Mensaje original-----
De: [email protected]
[mailto:[email protected]] En nombre de Reynier
Perez M.
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