2011-01-25 11 views
21

रूबी के बीच अंतर Proc.new और lambda (या ->() ऑपरेटर 1.9 में) के माध्यम से बनाई गई प्रक्रियाओं के बीच अंतर है। ऐसा प्रतीत होता है कि गैर-लैम्ब्डा प्रक्रिया ब्लॉक तर्कों में पारित सरणी को विभाजित करेगी; लैम्ब्डा के माध्यम से बनाई गई प्रक्रियाएं नहीं होती हैं।प्रो और लैम्ब्डा

p = Proc.new { |a,b| a + b} 
p[[1,2]] # => 3 

l = lambda { |a,b| a + b } 
l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2) 

क्या किसी के पास इस व्यवहार के पीछे प्रेरणा में कोई अंतर्दृष्टि है?

+3

आप पहले से ही पता हो सकता है यह, लेकिन यह काम करता है: 'एल = लैम्ब्डा {| (ए, बी) | ए + बी}; एल [[1,2]] # => 3' – Phrogz

उत्तर

38

वहाँ lambdas और गैर लैम्ब्डा Proc रों के बीच दो मुख्य अंतर हैं:

  1. बस तरीकों की तरह, lambdas स्वयं से,, बस ब्लॉक की तरह वापसी जबकि संलग्न विधि से गैर लैम्ब्डा Proc रों वापसी।
  2. बस तरीकों की तरह, लैम्बडास में सख्त तर्क जांच होती है, जबकि गैर-लैम्ब्डा Proc के पास ब्लॉकों की तरह ढीली बहस की जांच होती है।

या, संक्षेप में: lambdas विधियों की तरह व्यवहार करते हैं, गैर-लैम्ब्डा Proc एस ब्लॉक की तरह व्यवहार करते हैं।

आप जो देख रहे हैं वह # 2 का एक उदाहरण है। इसे गैर-लैम्ब्डा Proc और लैम्बडा के अलावा एक ब्लॉक और एक विधि के साथ आज़माएं, और आप देखेंगे। (इस व्यवहार के बिना, Hash#each, एक असली PITA उपयोग करने के लिए किया जाएगा, क्योंकि यह उपज दो तत्वों के साथ एक सरणी करता है, लेकिन आप काफी हमेशा दो तर्क के रूप में यह इलाज के लिए चाहते हैं।)

+1

त्वरित प्रतिक्रिया के लिए धन्यवाद। # प्रत्येक/# सॉर्ट था कि मैं इस जगह कैसे पहली बार आया था। मैं Proc.new की verbosity से बचने के लिए निम्न वाक्यविन्यास का उपयोग कर समाप्त हुआ: -> ((ए, बी)) {...} – Brian

संबंधित मुद्दे