रूबी में सरणी के लिए बनाएँ या जोड़ें


85
foo ||= []
foo << :element

थोड़ा अकड़ता हुआ महसूस होता है। क्या अधिक मुहावरेदार तरीका है?


11
यह है मुहावरेदार रास्ता। आप इसे एक पंक्ति में रख सकते हैं (foo ||= []) << :element, लेकिन मुझे यह बदसूरत लगता है।
सर्जियो तुलन्त्सेव

4
आरंभिक मानों के लिए IMO उचित तरीका है। यदि आपके पास || = और << एक ही चर के भीतर एक ही विधि के लिए है, तो आपको IMO में कोड-गंध है और पहले से ही कुछ गलत है। यह पूछने के लिए कि कैसे करना है = = << असली समस्या को ठीक करने के बजाय केवल सौंदर्य प्रसाधन कर रहे हैं।
एपिरोस

जवाबों:


142
(foo ||= []) << :element

लेकिन मेह। क्या यह वास्तव में इतना पठनीय है कि इसे पठनीय रखा जा सके?


40
+1 के लिए "क्या यह वास्तव में इतना पठनीय है कि इसे पठनीय रखा जा सके?" पठनीयता राजा है।
टीन मैन

1
यदि fooअपने आप में एक अधिक जटिल अभिव्यक्ति है, जैसे कि (नेस्टेड) ​​हैश जिसमें आप मूल्यों को देखते हैं, तो यह कई बार मूल्यों को देखने से बचने या लुक अप एरे वैल्यू के लिए एक और वेरिएबल खर्च करने का एक अच्छा तरीका है।
sschuberth

60

आप किसी भी सरणी पर हमेशा पुश विधि का उपयोग कर सकते हैं। मुझे यह बेहतर लगता है।

(a ||= []).push(:element)

10

आप कर्नेल # ऐरे से भी लाभ प्राप्त कर सकते हैं , जैसे:

# foo = nil
foo = Array(foo).push(:element)
# => [:element]

जिसमें संभावित ऐरे को समतल करने का लाभ है, जैसे:

# foo = [1]
foo = Array(foo).push(:element)
# => [1, :element]

मुझे यकीन है कि नहीं कर रहा हूँ यह हमेशा रूबी में गारंटी दी जा होगा कि foo = fooसेट fooकरने के लिए nilजब fooअपरिभाषित है। इसके अलावा, Kernel#Arrayसमतल नहीं करता है foofooअगर यह एक ऐरे है तो बस वापस आ जाता है।
एरिक डुमिनील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.