2009-08-28 8 views
43

मैं एक फ़िल्टर बनाना चाहता हूं, और इसे किसी सरणी या हैश पर लागू करने में सक्षम हूं। उदाहरण के लिए:मैं रुबी में पुन: प्रयोज्य ब्लॉक/proc/lambda कैसे बना सकता हूं?

def isodd(i) 
    i % 2 == 1 
end 

The I इतना है कि यह उपयोग करने के लिए सक्षम होना चाहते हैं:

x = [1,2,3,4] 
puts x.select(isodd) 
x.delete_if(isodd) 
puts x 

यह है कि यह सीधे आगे होना चाहिए लगता है, लेकिन मैं समझ नहीं मैं क्या करने की जरूरत यह काम करने के लिए मिलता है।

उत्तर

68

एक लैम्ब्डा बनाएं और फिर & ऑपरेटर के साथ एक ब्लॉक में बदलने का:

isodd = lambda { |i| i % 2 == 1 } 
[1,2,3,4].select(&isodd) 
+3

आप मुफ्त स्टैंडिंग प्रो बनाने के लिए "स्टैबी लैम्ब्डा" ऑपरेटर का भी उपयोग कर सकते हैं। Http://stackoverflow.com/questions/9340117/what-is-the-stab-operator-in-ruby देखें। 'रूबी 1.9' के रूप में उपलब्ध है। बेशक, स्वाद और कोडिंग शैली का पूरी तरह से एक मामला :) – zealoushacker

+0

भविष्य में पढ़ने वालों के लिए, कोई भी इस प्रकार लैम्ब्डा बना सकता है: lambda_name = ->() {डालता है "हैलो वर्ल्ड"} – BKSpurgeon

18

आप एक नामित Proc बना सकते हैं और यह तरीकों कि ब्लॉक लेने के लिए पारित कर सकते हैं:

isodd = Proc.new { |i| i % 2 == 1 } 
x = [1,2,3,4] 
x.select(&isodd) # returns [1,3] 

& ऑपरेटर Proc/lambda और एक ब्लॉक के बीच परिवर्तित होता है, जो कि select जैसी विधियों की अपेक्षा करता है।

27
puts x.select(&method(:isodd)) 
+0

डेव और डैनियल के जवाब भी अच्छे हैं। यह एक विकल्प है। –

+2

+1 उत्तर तब उपयोगी होता है जब आपके पास एक मौजूदा विधि है जिसे आप lambda/proc के रूप में फिर से लिखना नहीं चाहते हैं। यह भी काम करता है अगर किसी विशिष्ट ऑब्जेक्ट पर विधि को कॉल करने की आवश्यकता है: 'x.select (& obj.method (: isodd))' – Kelvin

+0

अच्छा और यह सही प्रश्न का उत्तर देता है - वे लड़के जानना चाहते थे कि मौजूदा कैसे लपेटें विधि और इसे एक proc के रूप में पास करें – Dan

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