आगे स्पष्टीकरण प्रदान करने के लिए:
जॉय का कहना है कि Proc.new
का वापसी व्यवहार आश्चर्यजनक है। हालांकि जब आप मानते हैं कि Proc.new एक ब्लॉक की तरह व्यवहार करता है तो यह आश्चर्य की बात नहीं है क्योंकि यह बिल्कुल सही है कि ब्लॉक कैसे व्यवहार करते हैं। दूसरी ओर भेड़िये विधियों की तरह व्यवहार करते हैं।
यह वास्तव में बताता है कि जब धन की बात आती है (तर्कों की संख्या) की प्रक्रियाएं लचीली नहीं होती हैं, जबकि प्रक्रियाएं लचीली होती हैं। ब्लॉक को उनके सभी तर्कों की आवश्यकता नहीं होती है लेकिन विधियां होती हैं (जब तक कोई डिफ़ॉल्ट प्रदान नहीं किया जाता है)। जबकि लैम्ब्डा तर्क डिफ़ॉल्ट प्रदान करना रूबी 1.8 में कोई विकल्प नहीं है, अब यह वैकल्पिक लैम्ब्डा वाक्यविन्यास (जैसा कि वेबमैट द्वारा नोट किया गया है) के साथ रुबी 1.9 में समर्थित है:
concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1) # => "12"
और मिचिल डी मारे (ओपी) प्रो और लैम्बडा रूबी 1.9 में धर्मार्थता के साथ व्यवहार करने के बारे में गलत है। मैंने सत्यापित किया है कि वे अभी भी ऊपर निर्दिष्ट अनुसार 1.8 से व्यवहार बनाए रखते हैं।
break
statements don't actually make much sense in either Procs or lambdas. In Procs, the break would return you from Proc.new which has already been completed. And it doesn't make any sense to break from a lambda since it's essentially a method, and you would never break from the top level of a method.
next
, redo
, and raise
behave the same in both Procs and lambdas. Whereas retry
is not allowed in either and will raise an exception.
और अंत में, proc
विधि का उपयोग कभी भी नहीं किया जाना चाहिए क्योंकि यह असंगत है और अप्रत्याशित व्यवहार है। रूबी 1.8 में यह वास्तव में एक भेड़ का बच्चा देता है! रूबी 1.9 में यह तय किया गया है और यह एक प्रक्रिया देता है। यदि आप एक प्रक्रिया बनाना चाहते हैं, तो Proc.new
के साथ चिपके रहें।
अधिक जानकारी के लिए, मैं ओ'रेली की रूबी प्रोग्रामिंग भाषा की अत्यधिक अनुशंसा करता हूं जो कि अधिकांश जानकारी के लिए मेरा स्रोत है।