जब सरणियों पर पुनरावृत्ति करते हैं, तो एक शॉर्टहैंड है जिसका मैं बार-बार उपयोग करता हूँ। यह `&:` ट्रिक है, जिसे "एम्परसैंड कोलन" या "प्रेट्ज़ेल कोलन" भी कहा जाता है। यदि आप इससे परिचित नहीं हैं, तो यहाँ बताया गया है कि यह कैसे काम करता है:
words = ["would", "you", "like", "to", "play", "a", "game?"] # यह... words.map &:length # ..इसके बराबर है: words.map { |w| w.length }
हाल तक, मैंने माना था कि `&:` सिंटैक्स एक ऑपरेटर था। लेकिन यह नहीं है। यह एक चतुर हैक है जो ActiveSupport में शुरू हुआ और Ruby 1.8.7 में एक आधिकारिक सुविधा बन गया।
`&` ऑपरेटर
AND लॉजिक ऑपरेशन के लिए उपयोग किए जाने के अलावा, Ruby में "&" वर्ण का एक और उपयोग है। जब इसे मेथड आर्गुमेंट की शुरुआत में जोड़ा जाता है, तो यह अपने ऑपरेंड पर `to_proc` कॉल करता है और इसे एक ब्लॉक के रूप में पास करता है। यह एक मुंह भरने जैसा है। उदाहरण देखना बहुत सरल है:
def my_method(&block) block.call end class Greeter def self.to_proc Proc.new { "hello" } end end my_method(&Greeter) # "hello" लौटाता है
Symbol#to_proc
आप किसी भी ऑब्जेक्ट में `to_proc` मेथड जोड़ सकते हैं, जिसमें Symbol भी शामिल है। `&:` शॉर्टकट की अनुमति देने के लिए Ruby ठीक यही करता है। यह कुछ इस तरह दिखता है:
class Symbol def to_proc Proc.new do |item| item.send self end end end
स्पष्ट है? महत्वपूर्ण हिस्सा `item.send(self)` है। इस मामले में Self सिंबल को संदर्भित करता है।
सब कुछ एक साथ रखना
`each` और `map` जैसे Enumerable मेथड एक ब्लॉक स्वीकार करते हैं। प्रत्येक आइटम के लिए वे ब्लॉक को कॉल करते हैं और उसे आइटम का संदर्भ पास करते हैं। इस मामले में ब्लॉक सिंबल पर `to_proc` कॉल करके उत्पन्न होता है।
# &:name एक Proc में मूल्यांकन होता है, जो item.send(:name) करता है items.map(&:name)
दिलचस्प बात यह है कि `map` को पता नहीं है कि यह सब हो रहा है! थोक काम `:name` सिंबल द्वारा किया जा रहा है। यह निश्चित रूप से चतुर है... लगभग मेरे स्वाद के लिए बहुत चतुर। लेकिन यह वर्षों से Ruby के मानक पुस्तकालय का हिस्सा रहा है, और यह इतना आसान है कि मुझे संदेह है कि मैं अभी इसका उपयोग करना बंद कर दूंगा। :)