É de conhecimento comum na maioria das linguagens de programação que o fluxo para trabalhar com arquivos é abrir-usar-fechar. Ainda assim, eu vi muitas vezes em códigos Ruby chamadas File.open incomparáveis e, além disso, encontrei esta joia de conhecimento nos documentos Ruby:
Os fluxos de E / S são fechados automaticamente quando são reivindicados pelo coletor de lixo.
darkredandyellow friendly irc aborda o problema:
[17:12] sim, e também, o número de descritores de arquivo geralmente é limitado pelo sistema operacional
[17:29] Presumo que você pode facilmente ficar sem descritores de arquivo disponíveis antes que o coletor de lixo limpe acima. nesse caso, você mesmo pode querer usar fechá-los. "reclamado pelo coletor de lixo." significa que o CG atua em algum momento no futuro. e é caro. uma série de razões para fechar arquivos explicitamente.
- Precisamos fechar explicitamente
- Se sim, por que o GC fecha automaticamente?
- Se não, por que a opção?
$ ulimit -n => 1024
só fica alto quando você faz apenas um trabalho simples. O mau hábito vai causar um grande problema um dia!Respostas:
Você pode dar um exemplo? Eu só vejo isso em código escrito por iniciantes que não têm "conhecimento comum na maioria das linguagens de programação de que o fluxo para trabalhar com arquivos é abrir-usar-fechar".
Rubistas experientes fecham explicitamente seus arquivos ou, de forma mais linguística, usam a forma de bloco de
File.open
, que fecha automaticamente o arquivo para você. Sua implementação é basicamente algo assim:Os scripts são um caso especial. Os scripts geralmente são executados tão curtos e usam tão poucos descritores de arquivo que simplesmente não faz sentido fechá-los, pois o sistema operacional os fechará de qualquer maneira quando o script for encerrado.
Sim.
Porque depois de coletar o objeto, não há mais como você fechar o arquivo e, portanto, você vazaria os descritores de arquivo.
Observe que não é o coletor de lixo que fecha os arquivos. O coletor de lixo simplesmente executa quaisquer finalizadores para um objeto antes de coletá-lo. Acontece que a
File
classe define um finalizador que fecha o arquivo.Porque a memória desperdiçada é barata, mas os descritores de arquivo desperdiçados não. Portanto, não faz sentido vincular o tempo de vida de um descritor de arquivo ao tempo de vida de algum pedaço de memória.
Você simplesmente não pode prever quando o coletor de lixo será executado. Você não pode sequer prever se ele será executado em tudo : se você nunca fique sem memória, o coletor de lixo nunca vai ficar, portanto, o finalizador nunca funcionará, portanto, o arquivo nunca será fechado.
fonte
ensure
,rescue
eraise
não é necessário.ensure
semrescue
. E você não pode simplesmente engolir a exceção silenciosamente, você precisa propagá-la para o chamador, após ter fechado o arquivo. De qualquer forma, lembre-me novamente em maio de '15 :-DVocê deve sempre fechar os descritores de arquivo após o uso, isso também irá liberá-los. Freqüentemente, as pessoas usam File.open ou método equivalente com blocos para lidar com o tempo de vida do descritor de arquivo. Por exemplo:
Nesse exemplo, o arquivo é fechado automaticamente.
fonte
De acordo com http://ruby-doc.org/core-2.1.4/File.html#method-c-open
Portanto, será fechado automaticamente quando o bloco terminar : D
fonte
fonte
Podemos usar a
File.read()
função para ler o arquivo em ruby ... como,neste exemplo
file_variable
pode ter o valor total desse arquivo ....fonte