2010-12-28 5 views
11

गहरे लाल रंग का है, तो आप ऐसा कर सकते हैं:रूबी - अधिभावी/एकाधिक काम को सक्षम करने (जैसे `एक, ख, ग = डी, ई, f`)

d = [1, 2, 3] 
a, b, c = d 

a, b, और c, प्राप्त होगा क्रमशः 1, 2, और 3 मान।

d, इस मामले में एक Array और गहरे लाल रंग का में यह a, b, और c करने के लिए सामग्री है आवंटित करने के लिए जानता है। लेकिन, dFixnum थे, उदाहरण के लिए, केवल ad के मान को सौंपा जाएगा जबकि b और cnil असाइन किया जाएगा।

d के गुणों को एकाधिक असाइनमेंट के लिए उपयोग करने की अनुमति देता है? अब तक मेरी खोज में, मैं केवल Array के उप-वर्गों के उदाहरणों को इस तरह से व्यवहार करने में सक्षम हूं।

उत्तर

11

यह एक बहुत ही अनियंत्रित विशेषता है, और मैं इसे सावधानी के साथ उपयोग करता हूं, लेकिन यहां हम जाते हैं। किताब से रूबी प्रोग्रामिंग भाषा:

जब एक से अधिक lvalues ​​और केवल एक ही rvalue देखते हैं, रूबी करने का प्रयास करता मान निर्दिष्ट की एक सूची में rvalue का विस्तार करें। यदि मान सरणी है, तो रूबी सरणी का विस्तार करती है ताकि प्रत्येक तत्व अपना स्वयं का रावल बन जाए। यदि मान कोई सरणी नहीं है लेकिन to_ary विधि लागू करता है, रूबी उस विधि को आमंत्रित करता है और फिर उस सरणी को वापस लाता है जो इसे लौटाता है।

रूबी 1.8 में यह to_ary विधि, रूबी में 1.9 प्रलेखन यह कहता है to_splat कहते है, लेकिन मैं परीक्षण नहीं किया (इस मशीन में कोई 1.9) यह उम्मीद के रूप में काम नहीं किया। इसलिए, आपको अपनी ऑब्जेक्ट में to_ary विधि को परिभाषित करना होगा।

class Week 
    def to_ary 
    %w(monday tuesday wednesday thursday friday saturday sunday) 
    end 
end 

mon, tue, wed, thu, *weekend = Week.new 

* %w(...) शब्द की एक सरणी के लिए एक विशेष अंकन है, यदि आप ['monday', 'tuesday' ...]

+0

लिखने के लिए आलसी हैं मुझे लगता है कि रूबी कोशिश करो! 1.9 का उपयोग करता है। या आप इसे पूरी तरह से छोड़ सकते हैं और jQuery RVM का उपयोग कर सकते हैं। –

+0

:) वास्तव में उत्तर के बाद 'rvm इंस्टॉल 1.9.1' पर गया – Chubas

7

d के गुणों को एकाधिक असाइनमेंट के लिए उपयोग करने की अनुमति देता है?

d को Array होना चाहिए या एक में परिवर्तनीय होना चाहिए। IOW यह या तो Array वर्ग का एक उदाहरण (या उसके उपवर्गों के किसी भी) होना चाहिए या to_ary संदेश का जवाब:

def (not_an_array = Object.new).to_ary; [:foo, :bar, :baz] end 

foo, bar, baz = not_an_array 

foo # => :foo 
bar # => :bar 
baz # => :baz 

ध्यान दें कि यह रूबी में एक अधिक सामान्य पैटर्न का एक उदाहरण है: में लगभग सभी तरीकों रूबी कि एक Array उम्मीद करते हैं, एक String, एक Integer या एक Float भी एक उद्देश्य यह है कि to_ary, to_str, to_int या to_float का जवाब को स्वीकार करेंगे। और आपके अपने विधियों को भी वैसे भी चाहिए!