হ্যাঁ, ensure
কোডটি সর্বদা মূল্যায়ন করা হয় তা নিশ্চিত করে। এ কারণেই এটি বলা হয় ensure
। সুতরাং, এটি জাভা এবং সি # এর সমতুল্য finally
।
সাধারণ প্রবাহ begin
/ rescue
/ else
/ ensure
/ এর end
মতো দেখায়:
begin
# something which might raise an exception
rescue SomeExceptionClass => some_variable
# code that deals with some exception
rescue SomeOtherException => some_other_variable
# code that deals with some other exception
else
# code that runs only if *no* exception was raised
ensure
# ensure that this code always runs, no matter what
# does not change the final value of the block
end
আপনি ছেড়ে যেতে পারেন rescue
, ensure
বা else
। আপনি নিজের ব্যতিক্রম হ্যান্ডলিং কোডে ব্যতিক্রমটি পরীক্ষা করতে সক্ষম হবেন না এমন ক্ষেত্রে আপনি ভেরিয়েবলগুলিও ছেড়ে দিতে পারেন। (ভাল, আপনি উত্থাপিত সর্বশেষ ব্যতিক্রমটি অ্যাক্সেস করতে সর্বদা বিশ্বব্যাপী ব্যতিক্রম ভেরিয়েবলটি ব্যবহার করতে পারেন তবে এটি খানিকটা হ্যাকি)) এবং আপনি ব্যতিক্রম শ্রেণিটি ছেড়ে দিতে পারেন, সেক্ষেত্রে উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত ব্যতিক্রম StandardError
ধরা পড়বে। (দয়া করে নোট অর্থ কি এই যে করেন না, যে সব ব্যতিক্রম ধরা হয়, কারণ সেখানে ব্যতিক্রম যার দৃষ্টান্ত রয়েছে Exception
কিন্তু StandardError
। প্রায় খুব তীব্র ব্যতিক্রম যে আপস যেমন প্রোগ্রাম অখণ্ডতা SystemStackError
, NoMemoryError
, SecurityError
, NotImplementedError
, LoadError
, SyntaxError
, ScriptError
, Interrupt
,SignalException
বা SystemExit
।)
কিছু ব্লক অন্তর্ভুক্ত ব্যতিক্রম ব্লক গঠন করে। উদাহরণস্বরূপ, পদ্ধতির সংজ্ঞাগুলি স্পষ্টতই ব্যতিক্রম ব্লকগুলিও তাই লেখার পরিবর্তে
def foo
begin
# ...
rescue
# ...
end
end
আপনি শুধু লিখুন
def foo
# ...
rescue
# ...
end
অথবা
def foo
# ...
ensure
# ...
end
class
সংজ্ঞা এবং module
সংজ্ঞাগুলির ক্ষেত্রেও একই প্রযোজ্য ।
যাইহোক, আপনি যে নির্দিষ্ট ক্ষেত্রে সম্পর্কে জিজ্ঞাসা করছেন সে ক্ষেত্রে আসলে আরও অনেক ভাল প্রতিমা রয়েছে। সাধারণভাবে, আপনি যখন শেষে এমন কোনও সংস্থান নিয়ে কাজ করতে চান যা আপনাকে পরিষ্কার করতে হবে তখন আপনি কোনও পদ্ধতিতে একটি ব্লক পাস করে যা আপনার জন্য সমস্ত ক্লিনআপ করে। এটি using
সি # এর একটি ব্লকের মতোই , রুবি আসলেই যথেষ্ট শক্তিশালী যে আপনাকে মাইক্রোসফ্টের উচ্চ পুরোহিতদের পর্বত থেকে নেমে আসা উচিত নয় এবং দয়া করে আপনার জন্য তাদের সংকলকটি পরিবর্তন করতে হবে না। রুবিতে আপনি কেবল এটি প্রয়োগ করতে পারেন:
# This is what you want to do:
File.open('myFile.txt', 'w') do |file|
file.puts content
end
# And this is how you might implement it:
def File.open(filename, mode='r', perm=nil, opt=nil)
yield filehandle = new(filename, mode, perm, opt)
ensure
filehandle&.close
end
এবং আপনি কী জানেন: এটি মূল লাইব্রেরিতে ইতিমধ্যে উপলব্ধ File.open
। তবে এটি একটি সাধারণ প্যাটার্ন যা আপনি নিজের কোডটিতেও ব্যবহার করতে পারেন, যেকোন ধরণের রিসোর্স ক্লিনআপ ( using
সি # à লা ) বা লেনদেনের জন্য বা আপনি যা ভাবেন তা বিবেচনা করতে পারেন।
একমাত্র ক্ষেত্রে যেখানে এটি কাজ করে না, যদি সম্পদ অর্জন ও প্রকাশ করে প্রোগ্রামের বিভিন্ন অংশে বিতরণ করা হয়। তবে এটি যদি আপনার স্থানীয় উদাহরণ হিসাবে স্থানীয় হয় তবে আপনি সহজেই এই সংস্থানগুলি ব্যবহার করতে পারেন।
বিটিডাব্লু: আধুনিক সি # using
তে আসলে অতিরিক্ত অতিরিক্ত, কারণ আপনি রুবি স্টাইলের রিসোর্স ব্লকগুলি নিজেকে ব্লক করতে পারেন:
class File
{
static T open<T>(string filename, string mode, Func<File, T> block)
{
var handle = new File(filename, mode);
try
{
return block(handle);
}
finally
{
handle.Dispose();
}
}
}
// Usage:
File.open("myFile.txt", "w", (file) =>
{
file.WriteLine(contents);
});
begin
ব্লকের ভিতরে থাকা ।