2009-12-25 8 views
277

संभव डुप्लिकेट:
What does map(&:name) mean in Ruby?रूबी एम्परसेंड बृहदान्त्र शॉर्टकट

रूबी में, मुझे पता है कि अगर मैं कार्य करें:

some_objects.each(&:foo) 

यह

some_objects.each { |obj| obj.foo } 
की तरह ही है

वह है, &:foo ब्लॉक { |obj| obj.foo } बनाता है, इसे एक प्रो में बदल देता है, और इसे प्रत्येक को पास करता है। यह क्यों काम करता है? क्या यह सिर्फ एक रूबी विशेष मामला है, या ऐसा कारण है कि यह क्यों काम करता है?

+0

इसे [प्रीट्ज़ेल] (http://blog.honeybadger.io/how-ruby-ampersand-colon-works/) [colon] के रूप में भी जाना जाता है (http://technology.customink.com/blog/ 2015/06/08/ruby-pretzels /) वाक्यविन्यास। – anothermh

उत्तर

430

यहां क्या हो रहा है "एम्परस एंड कॉलन" नहीं है, यह "एम्परसेंड एंड ऑब्जेक्ट" है। इस मामले में कोलन प्रतीक के लिए है। तो, & है और :foo है।

& ऑब्जेक्ट पर to_proc पर कॉल करता है, और इसे विधि के लिए ब्लॉक के रूप में पास करता है। रेल में, to_procSymbol पर कार्यान्वित किया जाता है, ताकि इन दोनों कॉल के बराबर हैं:

something {|i| i.foo } 
something(&:foo) 

इसके अलावा, to_procSymbol पर रूबी 1.8.7 और 1.9 में कार्यान्वित किया जाता है, इसलिए यह वास्तव में एक "गहरे लाल रंग का बात है।"

तो, योग करने के लिए: & वस्तु पर to_proc कॉल करता है और विधि के लिए एक ब्लॉक के रूप में यह गुजरता है, और रूबी को लागू करता है Symbol पर to_proc

+71

अधिक सटीक: एम्परसैंड 'प्रो' ऑब्जेक्ट को अनपैक करता है ताकि यह पारित हो जाए जैसे कि यह एक शाब्दिक ब्लॉक था। केवल अगर ऑब्जेक्ट * पहले से ही 'Proc' ऑब्जेक्ट नहीं है, तो क्या यह' to_proc' को कॉल करता है। –

+0

प्रतीक # to_proc केवल रूबी में मूल है> 1.9 –

+6

@Steve: नहीं, यह 1.8.7 में भी है। पी RUBY_VERSION # => "1.8.7" p [ "एक", "बी", "सी"] नक्शा (और: upcase)। # => [ 'ए', 'बी', 'सी "] –

69

एम्परसैंड और प्रतीक के संयोजन के बारे में कुछ खास नहीं है। यहां एक उदाहरण दिया गया है कि (एबी) रेगेक्स का उपयोग करता है:

class Regexp 
    def to_proc 
    ->(str) { self =~ str ; $1 } 
    end 
end 
%w(station nation information).map &/(.*)ion/ 

=> ["stat", "nat", "informat"] 

या पूर्णांक।

class Integer 
    def to_proc 
    ->(arr) { arr[self] } 
    end 
end 

arr = [[*3..7],[*14..27],[*?a..?z]] 
arr.map &4 
=> [7, 18, "e"] 

कौन arr.map(&:fifth) की जरूरत है जब आप arr.map &4 है?

+3

इस उदाहरण को सही चिह्नित चिह्नित उत्तर से बेहतर पसंद आया – Donato

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