2009-12-26 9 views
7
>> a = 5 
=> 5 
>> b = "hello, world!" 
=> "hello, world!" 
>> b.dup 
=> "hello, world!" 
>> a.dup 
TypeError: can't dup Fixnum 
    from (irb):4:in `dup' 
    from (irb):4 

मैं समझता हूं कि जब भी आप एक नए चर के लिए एक पूर्णांक आवंटित करते हैं तो रूबी एक प्रतिलिपि बनायेगा, लेकिन Numeric#dup एक त्रुटि क्यों उठाता है?संख्याओं का समर्थन क्यों नहीं करते हैं। Dup?

क्या यह ब्रेक अबास्ट्रक्शन नहीं होगा, क्योंकि सभी ऑब्जेक्ट्स को .dup को ठीक से जवाब देने की उम्मीद की जानी चाहिए?

, नए सिरे से लिखना dup विधि समस्या ठीक हो जाएगी जहाँ तक मैं बता सकते हैं:

>> class Numeric 
>> def dup() 
>>  self 
>> end 
>> end 

यह एक नकारात्मक पक्ष यह है मैं नहीं दिखाई दे रहा है? यह रूबी में क्यों नहीं बनाया गया है?

उत्तर

14

रूबी में अधिकांश ऑब्जेक्ट संदर्भ द्वारा पारित किए जाते हैं और उन्हें डुप्लिकेट किया जा सकता है। उदाहरण:

s = "Hello" 
t = s  # s & t reference to the same string 
t.upcase! # modifying either one will affect the other 
s # ==> "HELLO" 

रूबी में कुछ वस्तुएं तत्काल हैं, हालांकि। वे मूल्य से पारित होते हैं, केवल इस मूल्य में से एक हो सकता है और इसलिए इसे नकल नहीं किया जा सकता है। ये किसी भी (छोटे) पूर्णांक हैं, true, false, प्रतीकों और nil। 64 बिट सिस्टम पर रूबी 2.0 में कई फ्लोट भी तत्काल होते हैं।

इस (preposterous) उदाहरण में, कोई भी "42" एक ही आवृत्ति चर रखेगा।

class Fixnum 
    attr_accessor :name 
    alias_method :original_to_s, :to_s 
    def to_s 
    name || original_to_s 
    end 
end 
42.name = "The Answer" 
puts *41..43 # => 41, The Answer, 43 

के बाद से आप सामान्य रूप से उम्मीद होती है something.dup.name = "new name" प्रतिलिपि dup के साथ प्राप्त की तुलना में किसी अन्य वस्तु को प्रभावित नहीं करने के लिए, रूबी immediates पर dup परिभाषित करने के लिए नहीं चुनता है।

आपका प्रश्न यह दिखाई देने से अधिक जटिल है। रुबी-कोर पर some discussion था कि यह कैसे आसान बनाया जा सकता है। इसके अलावा, अन्य प्रकार के न्यूमेरिक ऑब्जेक्ट्स (फ्लोट्स, बिग्नम्स, राशनल्स और कॉम्प्लेक्स नंबर) को डुप्लिकेट नहीं किया जा सकता है हालांकि वे या तो तत्काल नहीं हैं।

ध्यान दें कि ActiveSupport (रेल का हिस्सा) सभी वस्तुओं

+1

सक्रिय समर्थन, रेल नहीं, 'डुप्लिकेट योग्य 'विधि प्रदान करता है।तो आप केवल ActiveSupport इंस्टॉल कर सकते हैं और यदि आप (और कई अन्य) उपयोगिता विधियों को चाहते हैं तो उसे 'सक्रिय' समर्थन 'की आवश्यकता होती है)। – henrikhodne

+0

दरअसल। अपडेट किया गया। –

+0

लिंक को https://bugs.ruby-lang.org/issues/1844 द्वारा प्रतिस्थापित किया जाना चाहिए। इसके अलावा, सुविधा अस्वीकार कर दी गई थी क्योंकि स्पष्ट रूप से कोई प्रगति नहीं हुई थी। –

2

dup() समारोह है कि आप परिभाषित के साथ समस्या यह है कि यह वस्तु का एक प्रतिलिपि वापस नहीं करता है, बल्कि वस्तु ही देता है। यह नहीं है कि duplicate प्रक्रिया को क्या करना है।

मैं रूबी पता नहीं है, लेकिन एक संभावित कारण मैं के लिए dup संख्या के लिए परिभाषित नहीं किया जा रहा के बारे में सोच सकते हैं कि एक नंबर एक बुनियादी प्रकार है है और इस तरह, की तरह कुछ कर रही: स्वचालित रूप से

>> a = 5 
>> b = a 

हैं b और a मेमोरी में समान मान को इंगित करने के विपरीत, 5 वैरिएबल b में मान असाइन करें।

+0

कि वास्तव में क्या रूबी करता है, इसलिए जब आप एक अंकीय प्रकार के साथ मेरी विधि का उपयोग करें, यह एक नई प्रतिलिपि वापस आ जाएगी पर विधि duplicable? प्रदान करते हैं। (और किसी अन्य प्रकार के लिए, यह मूल के संदर्भ को वापस कर देगा) –

+0

मुझे लगता है कि यह सच है। एक कार्यक्षमता दृष्टिकोण से, तो, शायद आपके कोड के साथ कोई समस्या नहीं है। हालांकि, रूबी ने इसका निर्माण संभवतः नहीं किया है क्योंकि यह रूबी के मूल प्रकारों की अंतर्निहित असाइनमेंट कार्यक्षमता को डुप्लिकेट करेगा। – cmptrgeekken

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

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