हां, ensure
यह सुनिश्चित करता है कि कोड का हमेशा मूल्यांकन किया जाए। इसलिए इसे कहा जाता है ensure
। तो, यह जावा और C # के बराबर है 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
C # में एक ला ) को लागू करने के लिए या लेनदेन या जो भी आप सोच सकते हैं।
एकमात्र मामला जहां यह काम नहीं करता है, अगर संसाधन प्राप्त करना और जारी करना कार्यक्रम के विभिन्न हिस्सों में वितरित किया जाता है। लेकिन अगर यह आपके उदाहरण के अनुसार स्थानीयकृत है, तो आप इन संसाधन ब्लॉकों का उपयोग आसानी से कर सकते हैं।
BTW: आधुनिक C # में, 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
ब्लॉक के अंदर खोलना चाहते हैं ।