Этот вопрос нео том, как автоматически закрывать файл с синтаксисом блока File#close или File#open. Это вопрос о том, где Ruby хранит свой список дескрипторов открытых файлов во время выполнения.
Если у вас есть программа с открытыми дескрипторами, но у вас нет доступа к соответствующему объекту File или IO, как вы можете найти ссылку на открытые в данный момент файловые дескрипторы? Возьмем такой пример:
filename='/tmp/foo'
%x( touch "#{filename}" )
File.open(filename)
filehandle = File.open(filename)
Первый экземпляр File открыт, но ссылка на объект не сохраняется в переменной. Второй экземпляр хранится в filehandle, где я могу легко получить к нему доступ с помощью #inspect или #close.
Однако отброшенный объект File никуда не делся; это просто недоступно каким-либо очевидным образом. Пока объект не будет завершен, Руби должен где-то его отслеживать... но где?