ऐसी कई चीजें हैं जो ब्लॉक के बारे में अच्छी हैं। लिफ्ट पिच: ब्लॉक हमें क्रिया पास करते हैं, वैसे ही हम सामान्य रूप से लगभग डेटा पास करते हैं।
सबसे स्पष्ट स्तर यह है कि वे आपको अमूर्त चीजों को ऐसे कार्यों में छोड़ देते हैं जो अन्यथा संभव नहीं होंगे।उदाहरण के लिए, एक मामले ऐसे हैं जिनमें चीजों की एक सूची है को देखो और आप इसे फिल्टर करने के लिए केवल आइटम है कि कुछ कसौटी से मेल खाते हैं शामिल करना चाहते हैं:
int list[50] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50};
int evenNumbers[50] = {0};
int copyIndex = 0;
for (int i = 0; i < 50; i++) {
if (list[i] % 2 == 0) {
evenNumbers[copyIndex++] = list[i];
}
}
यहाँ आप कैसे लिखते हैं कि रूबी में:
list = 1..50
listCopy = list.select {|n| n.even?}
सभी सामान्य व्यस्त कार्य आपके कोड से और एक सार्थक नाम के साथ एक विधि में स्थानांतरित हो जाते हैं। हमें सरणी की प्रतिलिपि बनाने और इंडेक्स के माध्यम से जाने की परवाह नहीं है और यह सब - हम सिर्फ फ़िल्टर की गई सूची चाहते हैं। और यही select
हमें देता है। ब्लॉक हमें इस मानक विधि में हमारे कस्टम तर्क को पारित करने की अनुमति देता है।
लेकिन इटरेटर एकमात्र ऐसा स्थान नहीं हैं जहां यह "hole in the middle pattern" उपयोगी है। उदाहरण के लिए, यदि आप File.open
पर कोई ब्लॉक पास करते हैं, तो यह फ़ाइल खोल देगा, फ़ाइल के साथ ब्लॉक निष्पादित करेगा और फिर आपके लिए फ़ाइल बंद कर देगा।
ब्लॉक करने वाली एक और चीज हमें कॉलबैक का एक शक्तिशाली रूप है। उदाहरण के लिए, ब्लॉक के बिना, हम कुछ इस तरह (कैसे संवाद वास्तव में ऑब्जेक्टिव-सी कोको में काम के आधार पर) करने के लिए हो सकता है:
class Controller
def delete_button_clicked(item)
item.add_red_highlight
context = {:item => item}
dialog = Dialog.new("Are you sure you want to delete #{item}?")
dialog.ok_callback = :delete_OK
dialog.ok_receiver = self
dialog.cancel_callback = :cancel_delete
dialog.cancel_receiver = self
dialog.context = context
dialog.ask_for_confirmation
end
def delete_OK(sender)
delete(sender.context[:item])
sender.dismiss
end
def cancel_delete(sender)
sender.context[:item].remove_red_highlight
sender.dismiss
end
end
Yowza। ब्लॉक के साथ, हम इस के बजाय कर सकता है (एक आम कई रूबी पुस्तकालयों में इस्तेमाल किया पद्धति के आधार पर):
class Controller
def delete_button_clicked(item)
item.add_red_highlight
Dialog.ask_for_confirmation("Are you sure you want to delete #{item}?") do |response|
response.ok { delete item }
response.cancel { item.remove_red_highlight }
end
end
end
वास्तव में ब्लॉक के दो स्तर है कि - do...end
ब्लॉक और दो {}
शैली ब्लॉक। लेकिन यह बहुत स्वाभाविक रूप से पढ़ता है, है ना? यह काम करता है क्योंकि एक ब्लॉक उस संदर्भ को कैप्चर करता है जो इसे बनाया गया है, इसलिए हमें self
और item
पास करने की आवश्यकता नहीं है।
प्रोसेस के लिए, वे केवल ब्लॉक के लिए एक ऑब्जेक्ट रैपर हैं। उनके लिए बहुत कुछ नहीं।
क्लोजर पर अधिक जानकारी के लिए देखो, इससे यह बताने में मदद मिलेगी कि ब्लॉक और प्रोसेस कैसे काम करते हैं और वे किसके लिए उपयोगी हैं .. – Doon