ผมเห็นหลายครั้งในรหัสทับทิมเปรียบFile.open
โทร
คุณสามารถยกตัวอย่างได้หรือไม่? ฉันเคยเห็นว่าในโค้ดที่เขียนโดยมือใหม่ที่ขาด "ความรู้ทั่วไปในภาษาโปรแกรมส่วนใหญ่ที่โฟลว์สำหรับการทำงานกับไฟล์เป็นแบบเปิด - ใช้ - ปิด"
Rubyists ที่มีประสบการณ์อาจปิดไฟล์ของตนอย่างชัดเจนหรือใช้รูปแบบการบล็อกFile.open
ซึ่งจะปิดไฟล์ให้คุณโดยอัตโนมัติ การใช้งานโดยทั่วไปมีลักษณะดังนี้:
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
สคริปต์เป็นกรณีพิเศษ โดยทั่วไปสคริปต์จะทำงานสั้น ๆ และใช้ตัวอธิบายไฟล์เพียงไม่กี่ตัวจึงไม่สมเหตุสมผลที่จะปิดเนื่องจากระบบปฏิบัติการจะปิดมันต่อไปเมื่อสคริปต์ออก
เราจำเป็นต้องปิดอย่างชัดเจนหรือไม่?
ใช่.
ถ้าใช่เหตุใด GC จึงปิดอัตโนมัติ
เนื่องจากหลังจากรวบรวมวัตถุแล้วจะไม่มีทางที่คุณจะปิดไฟล์ได้อีกต่อไปดังนั้นคุณจะทำให้ตัวอธิบายไฟล์รั่วไหล
โปรดทราบว่าไม่ใช่ตัวรวบรวมขยะที่ปิดไฟล์ ตัวเก็บขยะจะดำเนินการขั้นสุดท้ายของอ็อบเจ็กต์ก่อนที่จะรวบรวม มันเกิดขึ้นที่File
คลาสกำหนด Finalizer ซึ่งจะปิดไฟล์
ถ้าไม่แล้วทำไมตัวเลือก?
เนื่องจากหน่วยความจำที่เสียไปนั้นมีราคาถูก แต่ตัวอธิบายไฟล์ที่สิ้นเปลืองไม่ได้ ดังนั้นจึงไม่สมเหตุสมผลที่จะผูกอายุการใช้งานของตัวอธิบายไฟล์กับอายุการใช้งานของหน่วยความจำบางส่วน
คุณก็ไม่สามารถคาดการณ์เมื่อเก็บขยะจะทำงาน คุณไม่สามารถคาดการณ์ถ้ามันจะทำงานที่ทั้งหมด : ถ้าคุณไม่ทำงานออกจากหน่วยความจำเก็บขยะจะไม่ทำงานจึง finalizer จะไม่ทำงานจึงไฟล์จะไม่ถูกปิด