আমি রুবি কোডের সাথে মেলে না এমন File.open
কলগুলিতে অনেকবার দেখেছি
আপনি কি একটি উদাহরণ দিতে পারেন? আমি কেবল কখনও দেখতে পাই যে নবাবিদের লিখিত কোডে যাদের "বেশিরভাগ প্রোগ্রামিং ভাষায় সাধারণ জ্ঞানের অভাব যে ফাইলগুলির সাথে কাজ করার প্রবাহটি উন্মুক্ত-ব্যবহার-বন্ধ"।
অভিজ্ঞ রুবিস্টরা হয় স্পষ্টভাবে তাদের ফাইলগুলি বন্ধ করে দেয় বা আরও মূ id়ভাবে, এর ব্লক ফর্মটি ব্যবহার করে 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
স্ক্রিপ্টগুলি একটি বিশেষ কেস। স্ক্রিপ্টগুলি সাধারণত এত সংক্ষিপ্তভাবে চালিত হয় এবং খুব কম ফাইল বর্ণনাকারী ব্যবহার করে যে এগুলি বন্ধ করে দেওয়া সহজভাবে বোঝায় না, কারণ স্ক্রিপ্টটি প্রস্থান করার সময় অপারেটিং সিস্টেম যেভাবেই এগুলি বন্ধ করে দেবে।
আমাদের কি স্পষ্টভাবে বন্ধ করা দরকার?
হ্যাঁ.
যদি হ্যাঁ হয় তবে জিসি অটোক্লোজ করে কেন?
কারণ এটি বস্তুটি সংগ্রহ করার পরে, আপনার আর ফাইলটি বন্ধ করার কোনও উপায় নেই এবং সুতরাং আপনি ফাইল বর্ণনাকারীদের ফাঁস করবেন।
দ্রষ্টব্য যে এটি আবর্জনা সংগ্রহকারী নয় যা ফাইলগুলি বন্ধ করে দেয়। আবর্জনা সংগ্রহকারী কোনও বস্তুর এটি সংগ্রহের আগে কেবল কোনও চূড়ান্তকরণকারীকে কার্যকরভাবে কার্যকর করে। এটি ঠিক তাই ঘটে যে File
ক্লাস একটি ফাইনালাইজার সংজ্ঞায়িত করে যা ফাইলটি বন্ধ করে দেয়।
তা না হলে বিকল্প কেন?
কারণ নষ্ট মেমরিটি সস্তা, তবে নষ্ট ফাইল বর্ণনাকারী নয়। অতএব, কোনও ফাইল বর্ণনাকারীর জীবনকালকে কিছুটা মেমরির জীবনকালের সাথে বেঁধে রাখার কোনও মানে হয় না।
আবর্জনা সংগ্রহকারী কখন চলবে তা আপনি সহজেই অনুমান করতে পারবেন না । এটি আদৌ চলবে কিনা তা আপনি পূর্বাভাসও দিতে পারবেন না : যদি আপনি কখনও স্মৃতি থেকে সরে না যান, আবর্জনা সংগ্রহকারী কখনও চালাবেন না, তাই ফাইনালাইজারটি কখনও চালাবেনা, তাই ফাইলটি কখনও বন্ধ হবে না।