एक सरणी, एक एकल तत्व, या शून्य को देखते हुए, एक सरणी प्राप्त करें - बाद के दो क्रमशः एक एकल तत्व सरणी और एक खाली सरणी है।
मुझे गलती से लगा कि रूबी इस तरह काम करेगी:
[1,2,3].to_a #= [1,2,3] # Already an array, so no change
1.to_a #= [1] # Creates an array and adds element
nil.to_a #= [] # Creates empty array
लेकिन जो आपको वास्तव में मिलता है वह है:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
तो इसे हल करने के लिए, मुझे या तो एक अन्य विधि का उपयोग करने की आवश्यकता है, या मैं उन सभी वर्गों की to_a विधि को संशोधित करके मेटा प्रोग्राम कर सकता हूं जो मैं उपयोग करने का इरादा रखता हूं - जो मेरे लिए कोई विकल्प नहीं है।
तो एक विधि यह है:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
समस्या यह है कि यह थोड़ा गड़बड़ है। क्या ऐसा करने का एक सुंदर तरीका है? (मैं इस समस्या को हल करने के लिए रूबी-ईश तरीका है तो चकित हो जाएगा)
इसके क्या अनुप्रयोग हैं? यहां तक कि एक सरणी में परिवर्तित क्यों?
कॉलिंग में 'ActiveRecord' का कहना है कि user.postsया तो पदों की एक सरणी, एक एकल पद या शून्य वापस कर देंगे। इस के परिणामों पर काम करने वाले तरीकों को लिखते समय, यह मान लेना सबसे आसान है कि विधि एक सरणी लेगी, जिसमें शून्य, एक या कई तत्व हो सकते हैं। उदाहरण विधि:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==बजाय =, सही है?
[1,2,3].to_a करता है ! यह लौट आता है । [[1,2,3]][1,2,3]
user.postsएक भी पद कभी नहीं लौटाना चाहिए। कम से कम, मैंने इसे कभी नहीं देखा।