2011-07-26 6 views
6

Soy bastante nuevo en ruby ​​y actualmente estoy leyendo el libro de Pica para familiarizarme con todo. Encontré la sección File.open donde se analiza tomar un bloque como parámetro de una llamada File.open y luego garantizar que el archivo esté cerrado. Ahora esto suena como una manera absolutamente brillante de evitar dispararse en el pie y como estoy peligrosamente bajo en los dedos, creo que lo intentaré. Aquí está lo que escribí (en IRB si lo que importa):File.open y bloques en Ruby 1.8.7

File.open('somefile.txt', 'r').each { |line| puts line }`` 

Mi expectativa era que el archivo somefile.txt conseguiría abrir, leer, imprimir y cerrado, ¿verdad? Por lo que puedo decir mal. Si uso lsof para ver los identificadores de archivo abiertos, todavía está abierto. Sin embargo, si lo hago

f = File.open('somefile.txt', 'r').each { |line| puts line } 
f.close() 

Estoy usando bloques erróneos en este ejemplo, o tengo no pude entender el significado de File.open cuando se utiliza con un bloque. He leído la sección en ruby-doc.org related to File.open, pero eso solo parece confirmar que lo que estoy haciendo debería funcionar como se esperaba.

¿Alguien puede explicar lo que estoy haciendo mal?

Respuesta

8

Con el fin de cerrar archivo después de bloque, debe pasar al bloque File.open() directamente, no a each:

File.open('somefile.txt', 'r') do |f| 
    f.each_line { |l| puts l } 
end 

File.open(…).each {…} se acaba la iteración del archivo abierto sin cerrarla.

+0

File.open ('somefile.txt', 'r') {| f | f.each_line {| línea | puts line}} también funciona. ¡Gracias! – OldTroll

Cuestiones relacionadas