2010-03-30 16 views
8

जब मैं इस टाइप करें:क्यों रूबी में `3 *" दोहराना "` 3 * 'दोहराना नहीं है?

puts 'repeat' * 3 

मैं:

>> repeat repeat repeat 

लेकिन यह काम नहीं कर रहा है, तो मैं यह कर:

puts 3 * 'repeat' 

क्यों?

+3

यह एक रिसाव अमूर्त है। http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi

+5

मैं तर्क दूंगा कि यह एक रिसाव अबास्ट्रक्शन नहीं है, यह मानने का कोई कारण नहीं है कि * स्ट्रिंग और फिक्सम के लिए कम्यूटिव है। –

उत्तर

28

रूबी में, जब आप a * b पर कॉल करते हैं, तो आप वास्तव में a पर * नामक विधि को कॉल कर रहे हैं। उदाहरण के लिए यह प्रयास करें,:

a = 5 
=> 5 
b = 6 
=> 6 
a.*(b) 
=> 30 

c = "hello" 
=> "hello" 
c.*(a) 
=> "hellohellohellohellohello" 

इस प्रकार <String> * <Fixnum> ठीक काम करता है, क्योंकि String पर * विधि के महत्व को समझता पूर्णांकों को संभालने के लिए। यह स्वयं की कई प्रतियों को एक साथ जोड़कर प्रतिक्रिया देता है।

लेकिन जब आप 3 * "repeat" करते हैं, यह एक String तर्क के साथ Fixnum पर * लागू है। यह काम नहीं करता है, क्योंकि Fixnum की * विधि एक और संख्यात्मक प्रकार देखने की अपेक्षा करती है।

+0

वास्तव में ... शानदार जवाब ... अच्छी तरह से किया। – RubyDubee

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