2012-03-11 35 views
9

कभी-कभी मैं एक चर को हमेशा एक सरणी बनाना चाहता हूं, चाहे वह एक स्केलर या पहले से ही एक सरणी हो।एक सरणी बनने के लिए एक स्केलर या सरणी को

तो मैं सामान्य रूप से कार्य करें:

[variable].flatten 

जो माणिक 1.8.5, 1.8.7, 1.9.x. के साथ संगत है

इस विधि के साथ जब variable एक स्ट्रिंग (variable = "asdf") है, तो यह मुझे ["asdf"] देता है। यदि यह पहले से ही एक सरणी है (variable = ["asdf","bvcx"]), यह मुझे देता है: ["asdf","bvcx"]

क्या किसी के पास बेहतर तरीका है? "बेहतर" अर्थात् अन्य पठनीय, अधिक निष्पादक, संक्षिप्त या अन्य तरीकों से अधिक प्रभावी है।

उत्तर

13

तरह से मुझे क्या करना है, और लगता है कि मानक तरीका है, [*...] उपयोग कर रहा है:

variable1 = "string" 
variable2 = ["element1", "element2"] 

[*variable1] #=> ["string"] 
[*variable2] #=> ["element1", "element2"] 
+1

मुझे लुकापेट के रास्ते को नहीं पता था, और ऐसा लगता है, लेकिन जिस तरह से मैं ऊपर दिखाता हूं, वह गति से लगभग दोगुना काम करता है। – sawa

+0

किस कार्यान्वयन पर? YARV? –

+0

@AndrewGrimm हां। रुबी में YARV 1.9.3। – sawa

13
Array(variable) 

चाल चलाना चाहिए। यह छोटे ज्ञात Kernel#Array विधि का उपयोग करता है।

0

आप Array.eat की तरह कुछ जरूरत हो सकती है। ऑब्जेक्ट पर अन्य सभी विधियां या तो #to_a या #to_ary पर कॉल करें। यदि आप [ obj ].flatten का उपयोग कर रहे हैं जो आश्चर्यजनक परिणाम दे सकता है। #flatten घोंसला वाले सरणी को भी उलझाएगा जब तक कि स्तर पैरामीटर के साथ बुलाया न जाए और सरणी की एक अतिरिक्त प्रतिलिपि बनाये।

सक्रिय समर्थन Array.wrap प्रदान करता है, लेकिन यह #to_ary पर भी कॉल करता है, जो आपकी आवश्यकताओं के आधार पर आपकी पसंद के अनुसार हो सकता है या नहीं भी हो सकता है।

require 'active_support/core_ext/array/wrap' 

class Array 

# Coerce an object to be an array. Any object that is not an array will become 
# a single element array with object at index 0. 
# 
# coercing nil returns an empty array. 
# 
def self.eat(object) 

    object.nil?    and return [] 
    object.kind_of?(Array) and return object 

    [object] 

end 

end # class Array 

a = { a: 3 } 

p [a].flatten  # => [{:a=>3}] 
p [*a]    # => [[:a, 3]] -> OOPS 
p Array  a  # => [[:a, 3]] -> OOPS 
p Array.wrap a  # => [{:a=>3}] 
p Array.eat a  # => [{:a=>3}]