Saya melihat berkali-kali dalam kode ruby File.open
panggilan tak tertandingi
Bisakah Anda memberi contoh? Saya hanya pernah melihat bahwa dalam kode yang ditulis oleh pemula yang tidak memiliki "pengetahuan umum di sebagian besar bahasa pemrograman bahwa aliran untuk bekerja dengan file adalah buka-pakai-tutup".
Rubyist berpengalaman menutup file mereka secara eksplisit, atau lebih idiomatis, menggunakan bentuk blok File.open
, yang secara otomatis menutup file untuk Anda. Implementasinya pada dasarnya terlihat seperti ini:
def File.open(*args, &block)
return open_with_block(*args, &block) if block_given?
open_without_block(*args)
end
def File.open_without_block(*args)
end
def File.open_with_block(*args)
yield f = open_without_block(*args)
ensure
f.close
end
Naskah adalah kasus khusus. Skrip umumnya berjalan sangat pendek, dan menggunakan begitu sedikit deskriptor file sehingga tidak masuk akal untuk menutupnya, karena sistem operasi akan tetap menutupnya saat skrip keluar.
Apakah kita perlu menutupnya secara eksplisit?
Iya.
Jika ya, mengapa GC menutup otomatis?
Karena setelah objek terkumpul, tidak ada cara bagi Anda untuk menutup file lagi, dan dengan demikian Anda akan membocorkan deskriptor file.
Perhatikan bahwa bukan pengumpul sampah yang menutup file. Pengumpul sampah hanya menjalankan finalizer apa pun untuk suatu objek sebelum mengumpulkannya. Kebetulan File
kelas mendefinisikan finalizer yang menutup file.
Jika tidak, lalu mengapa harus dipilih?
Karena memori yang terbuang itu murah, tetapi deskriptor file yang terbuang tidak. Oleh karena itu, tidak masuk akal untuk mengikat masa pakai deskriptor file ke masa pakai beberapa bagian memori.
Anda tidak bisa memprediksi kapan pengumpul sampah akan berjalan. Anda bahkan tidak dapat memprediksi apakah itu akan berjalan sama sekali : jika Anda tidak pernah kehabisan memori, pengumpul sampah tidak akan pernah berjalan, oleh karena itu finalizer tidak akan pernah berjalan, oleh karena itu file tidak akan pernah ditutup.