2010-11-19 14 views
25

Tengo una pregunta sobre Block, ¿significan los dos códigos lo mismo?File.open with block vs without

código 1

File::open('yozloy.txt','w') do |f| 
    f << 'Some contains' 
end 

código 2

newFile = File::open('yozloy.txt','w') 
newFile << 'Some contains' 
+1

No creo que importe tanto, pero es mucho más común escribir métodos de clase como 'File.open' en lugar de' File :: open'. – Telemachus

+0

'código 2' no cerrará el archivo automáticamente, como lo hace' code 1'. Por lo tanto, tendrá que hacer 'newFile.close'. –

Respuesta

25

DarkDust ya dijo que estos métodos son diferentes. Te explicaré los bloques un poco más, ya que supongo que puedo adivinar por qué hiciste esta pregunta ;-)

El bloque en ruby ​​es solo un parámetro para algún método. No es solo una sintaxis diferente.

Los métodos que aceptan bloques (opcionales) suelen tener una condición para comprobar si se han llamado con bloqueo o sin ellos.

Considere este ejemplo muy simplificado: (el verdadero File.open es similar, pero asegura que el archivo se cierra incluso si su bloque genera un error, por ejemplo)

def open(fname) 
    self.do_open(fname) 
    if block_given? 
    yield(self) # This will 'run' the block with given parameter 
    self.close 
    else 
    return self # This will just return some value 
    end 
end 

En general, cada método puede trabaja (trabaja) de manera diferente con un bloque o sin un bloque. Debe indicarse siempre en la documentación del método.

+0

excelente explicación – mko

+0

Soy nuevo en Ruby y no puedo ejecutar su código. Intenté "file = open (file_name)" pero obtengo el método undefined 'do_open 'for main: Object (NoMethodError). ¿De dónde viene este método do_open? – Robert3452

33

No, no me refiero a la misma. En el primer ejemplo, el archivo se cierra automáticamente después de que se procesó el bloque. En el segundo ejemplo, es su responsabilidad llamar manualmente al newFile.close.