OT: Una duda de Ruby no de RoR

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 :wink: ). 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.

Espero que te ayude

Un saludo
Roberto M. Oliva

Reynier Perez M.
escribió:> Buenas a todos:

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ó:

Buenas a todos:

  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

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


Ror-es mailing list
[email protected]