2009-08-26 15 views
11

वापस नहीं लौटाती है, मैं 'स्ट्रिंग' प्रकार की वस्तुओं पर 'टैप' विधि का उपयोग करते समय एक दिलचस्प समस्या में भाग गया।स्ट्रिंग ऑब्जेक्ट पर 'टैप' विधि अपेक्षित परिणाम

"abc".tap { |o| o = "xyz" } # this line returns "abc" instead of "xyz" 

'टैप' विधि अन्य प्रकार की वस्तुओं पर काम करती है।

[].tap { |o| o << "xyz" } # this line returns ["xyz"] as expected 

मैं विंडोज XP पर रेल 2.3.2 और रूबी 1.8.6 का उपयोग कर रहा हूं।

मुझे यहां क्या याद आ रही है?

अद्यतन 1: मैंने इस मुद्दे को हल किया। यह मेरे हिस्से पर एक उपयोग त्रुटि थी। पहले परिदृश्य में मैं इसे संशोधित करने के बजाय ब्लॉक पैरामीटर के मान को फिर से असाइन कर रहा था। मैं कोड को फिर से लिखने और अपेक्षित परिणाम प्राप्त करने में सक्षम था।

"abc".tap { |o| o.replace "xyz" } 

अद्यतन 2: यहां उपयोग किया गया कोड केवल समस्या का प्रदर्शन करने के लिए है। मेरा वास्तविक कोड इस तरह दिखता नहीं है।

+0

क्या आपके पास ऐसा करने का प्रयास करने का एक वास्तविक उदाहरण हो सकता है? –

+1

मैंने इस मुद्दे को हल किया। यह मेरे हिस्से पर एक उपयोग त्रुटि थी। पहले परिदृश्य में मैं इसे संशोधित करने के बजाय ब्लॉक पैरामीटर के मान को फिर से असाइन कर रहा था। मैं कोड को फिर से लिखने और अपेक्षित परिणाम प्राप्त करने में सक्षम था। "एबीसी" .tap {| o | o.replace "xyz"} –

उत्तर

8

ऑब्जेक्ट # टैप हमेशा ब्लॉक को निष्पादित करने के बाद मूल वस्तु को पारित करता है, भले ही ब्लॉक कुछ अलग करता है।

यहां लाभ यह है कि आप एक श्रृंखला के बीच में टैप डाल सकते हैं और मूल मान को संशोधित किए बिना किसी ऑब्जेक्ट के मान का परीक्षण कर सकते हैं।

इसका मतलब है कि यदि आप टैप में "एबीसी" पास करते हैं, तो यह ब्लॉक निष्पादित करेगा और "एबीसी" वापस करेगा। ओ के लिए आपका असाइनमेंट स्कोपिंग के कारण कुछ भी नहीं है। इसी प्रकार, यदि आप टैप में एक खाली सरणी पास करते हैं, तो यह एक खाली सरणी वापस लौटाएगा। हालांकि, आपके दूसरे उदाहरण में, आपने मूल मान को संशोधित किया है। ऑपरेशंस जो मूल को संशोधित करते हैं जैसे < < या gsub! या इसी तरह ऑब्जेक्ट को इसके लौटने से पहले संशोधित कर देगा, इसलिए आपको एक अलग मूल्य वापस मिल जाएगा।

टैप का उपयोग करने के तरीके के बारे में कुछ और अच्छे उदाहरणों के लिए http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions देखें। असाइनमेंट या संशोधन के लिए इसका इस्तेमाल न करें या आप वापस जीतने वाले परिणाम प्राप्त करेंगे।

अद्यतन: आपके संपादन में, यह आपके मुद्दे को क्यों हल करता है? मुझे समझ में नहीं आता है कि आप प्रतिस्थापन करने के लिए टैप क्यों कॉल करेंगे जब आप केवल ऑब्जेक्ट पर प्रतिस्थापित कर सकते हैं। टैप आपको क्या लाभ है?

+2

हां, सरल प्रतिस्थापन करने के लिए 'टैप' का उपयोग करना समझ में नहीं आता है। मेरा वास्तविक कोड इस तरह दिखता नहीं है। कोड का एक बड़ा हिस्सा पोस्ट करने के बजाय, मैं इस उदाहरण के साथ समस्या को पुन: उत्पन्न करने के लिए आया था। मैं डिबगिंग के लिए 'टैप' का उपयोग करता हूं। हाल ही में मैंने 'वापसी' के स्थान पर 'टैप' का उपयोग करना शुरू कर दिया है। एक बार जब मैं टैप विधि के लिए रेल स्रोत कोड को दोबारा पढ़ता हूं, तो मेरी त्रुटि स्पष्ट हो गई। –

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