Sudah menjadi pengetahuan umum di sebagian besar bahasa pemrograman bahwa alur untuk bekerja dengan file bersifat buka-pakai-tutup. Namun saya melihat berkali-kali dalam kode ruby panggilan File.open tak tertandingi, dan terlebih lagi saya menemukan permata pengetahuan ini di dokumen ruby:
Aliran I / O secara otomatis ditutup saat diklaim oleh pengumpul sampah.
darkredandyellow friendly irc menangani masalah ini:
[17:12] ya, dan juga, jumlah deskriptor file biasanya dibatasi oleh OS
[17:29] Saya berasumsi bahwa Anda dapat dengan mudah kehabisan deskriptor file yang tersedia sebelum pengumpul sampah membersihkan naik. dalam hal ini, Anda mungkin ingin menggunakan close mereka sendiri. "diklaim oleh pemulung." artinya GC bertindak di beberapa titik di masa mendatang. dan itu mahal. banyak alasan untuk menutup file secara eksplisit.
- Apakah kita perlu menutup secara eksplisit
- Jika ya, mengapa GC menutup otomatis?
- Jika tidak, lalu mengapa harus dipilih?
$ ulimit -n => 1024
itu hanya tinggi ketika Anda melakukan hanya beberapa pekerjaan sederhana. Kebiasaan buruk suatu saat akan menimbulkan masalah besar!Jawaban:
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) # do whatever ... 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.
Iya.
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.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.
sumber
ensure
,rescue
danraise
tidak diperlukan sama sekali.ensure
tanparescue
. Dan Anda tidak bisa diam-diam menelan pengecualian, Anda harus menyebarkannya ke pemanggil, setelah menutup file. Bagaimanapun, ingatkan saya lagi di Mei '15 :-DAnda harus selalu menutup deskriptor file setelah digunakan, itu juga akan menghapusnya. Seringkali orang menggunakan File.open atau metode yang setara dengan blok untuk menangani seumur hidup deskriptor file. Sebagai contoh:
File.open('foo', 'w') do |f| f.write "bar" end
Dalam contoh itu, file ditutup secara otomatis.
sumber
Menurut http://ruby-doc.org/core-2.1.4/File.html#method-c-open
Oleh karena itu, secara otomatis akan ditutup ketika blok berhenti : D
sumber
sumber
Kita dapat menggunakan
File.read()
fungsi tersebut untuk membaca file di ruby ..... seperti,file_variable = File.read("filename.txt")
dalam contoh ini
file_variable
dapat memiliki nilai penuh dari file itu ....sumber