2012-08-28 12 views
62
foo ||= [] 
foo << :element 

में सरणी बनाने या जोड़ने के लिए थोड़ा गुंजाइश लगता है। क्या कोई और बेवकूफ तरीका है?रुबी

+10

यह ** है ** मुहावरेदार मार्ग। आप इसे '(foo || = []) <<: element' के रूप में एक-पंक्तिबद्ध कर सकते हैं, लेकिन मुझे यह उलझन में मिलती है। –

+3

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

उत्तर

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

लेकिन हुंह। क्या इसे पढ़ने योग्य रखने के लिए वास्तव में इतना कठिन है?

+31

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

+0

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

49

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

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

तुम भी तरह, Kernel#Array से फायदा हो सकता है:

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

जो एक संभावित सरणी सपाट, जैसे को लाभ मिलता है:

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