2009-12-11 5 views
1

Quelqu'un peut-il fournir des indices sur la raison pour laquelle ces deux codes ne sont pas équivalents? Ma seule pensée est que le .open dans la dernière partie du code n'est pas dans un bloc et le handle de fichier est laissé ouvert.Ruby I/O - Poignée de fichier ouverte

File.open(file) do |io| 
    io.each_line do |line| 
    body_string << line 
    end 
end 

et celui-ci

File.open(file).each_line {|line| body_string << line} 

Merci.

Répondre

3

fichier test.rb:

def test1 
    body_string = [] 
    [ File.open(ARGV[0]).each_line { |line| body_string << line }, body_string ] 
end 
def test2 
    body_string = [] 
    [ File.open(ARGV[0]) do |io| 
    io.each_line { |line| body_string << line } 
    end, body_string ] 
end 
puts(test1.inspect) 
puts(test2.inspect) 

fichier f:

hello! 

sortie ruby test.rb f:

[#<File:f>, ["hello!\n"]] 
[#<File:f (closed)>, ["hello!\n"]] 

La seule différence est que, lorsque File.open est donné un bloc, automatiquement ferme le handle de fichier.

HTH

5

Voir IO class's API.

Si File.open reçoit un bloc, il ouvre le fichier, exécute le bloc, puis ferme le fichier. S'il ne reçoit pas de bloc, il renvoie un objet représentant le fichier (comme File :: new), il peut donc toujours être ouvert.

Questions connexes