सही तरीका क्या है:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
या इसमें वस्तुओं की गिनती प्राप्त करने के लिए?
सही तरीका क्या है:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
या इसमें वस्तुओं की गिनती प्राप्त करने के लिए?
जवाबों:
आप शायद उपयोग करना चाहते हैं kind_of()।
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
kind_of?()अन्य समाधानों का उपयोग क्यों करना चाहेंगे ? दूसरों पर आपके उत्तर के लाभों पर कुछ स्पष्टीकरण भविष्य के पाठकों के लिए उपयोगी होगा।
आप यकीन है कि यह कर रहे हैं की जरूरत है एक श्रृंखला होना चाहिए? आप उपयोग करने में सक्षम हो सकते हैं respond_to?(method)ताकि आपका कोड समान चीज़ों के लिए काम करे जो आवश्यक रूप से सरणियाँ नहीं हैं (हो सकता है कि कुछ अन्य महत्वपूर्ण चीज़)। यदि आपको वास्तव में एक की आवश्यकता है array, तो Array#kind\_of?विधि का वर्णन करने वाला पद सबसे अच्छा है।
['hello'].respond_to?('each')
respond_to?(:to_ary)।
Array,केवल एक-स्तर में परिवर्तित होने के लिए परीक्षण के बजाय Array,आपके कोड को केवल एक मामले को संभालने की आवश्यकता है।
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
रूबी तुम क्यों अगर कुछ जानना चाहते हैं पर एक अनुमान ले जा रहा एक API जो एक वस्तु या वस्तुओं का एक सरणी ले जा सकते हैं मिलाना विभिन्न तरीकों से है, इसलिए, है किसी सरणी, मैं एक सुझाव है।
सूचक ऑपरेटर जादू के बहुत सारे शामिल है आप देख सकते हैं, या आप बस फोन कर सकते हैं Array(something)यदि आवश्यक हो तो जो किसी सरणी आवरण जोड़ देगा। यह [*something]इस एक मामले में समान है ।
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
या, आप पैरामीटर घोषणा में छप का उपयोग कर सकते हैं और फिर .flatten, आपको एक अलग प्रकार का कलेक्टर दे सकते हैं। (उस बात के लिए, आप .flattenऊपर भी कॉल कर सकते हैं।)
def f *x
p x.flatten.inspect
end # => nil
f 1 # => "[1]"
f 1,2 # => "[1, 2]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
f [1,2],3,4 # => "[1, 2, 3, 4]"
और, धन्यवाद gregschlom , यह कभी-कभी केवल उपयोग करने के लिए तेज़ होता है Array(x)क्योंकि जब यह पहले से ही है तो इसे Arrayएक नई वस्तु बनाने की आवश्यकता नहीं है।
[*nil] => []:। तो आप एक खाली सरणी के साथ समाप्त हो सकते हैं।
Array(foo)बहुत अधिक कुशल है[*foo]
[1,2,3].is_a? Array सत्य का मूल्यांकन करता है।
is_a?जो इस पूरे धागे में संदर्भ देता है। सबसे पास एक है [1,2,3].is_a? Enumerable। मुझे अभी भी लगता है कि यह जवाब देने के लायक है।
ऐसा लगता है कि आप आइटम के कुछ अवधारणा के बाद कुछ कर रहे हैं। मैं यह देखने की सलाह दूंगा कि क्या यह है Enumerable। यह भी अस्तित्व की गारंटी देता है #count।
उदाहरण के लिए,
[1,2,3].is_a? Enumerable
[1,2,3].count
ध्यान दें कि, जबकि size, lengthऔर countसरणियों के लिए सभी काम, countयहाँ सही अर्थ है - (उदाहरण के लिए, 'abc'.lengthऔर 'abc'.sizeदोनों काम करते हैं, लेकिन 'abc'.countउस तरह काम नहीं करता है)।
सावधानी: एक स्ट्रिंग is_a है? Enumerable, इसलिए शायद यह वह नहीं है जो आप चाहते हैं ... ऑब्जेक्ट की तरह एक सरणी की आपकी अवधारणा पर निर्भर करता है।
प्रयत्न:
def is_array(a)
a.class == Array
end
EDIT : अन्य उत्तर मेरे मुकाबले बहुत बेहतर है।
का उपयोग करने पर भी विचार करें Array()। से रूबी समुदाय स्टाइल गाइड :
स्पष्ट ऐरे चेक या [* var] के बजाय एरे () का उपयोग करें, जब आप एक एरे के रूप में व्यवहार करना चाहते हैं, तो एक वेरिएबल के साथ व्यवहार करें, लेकिन आप निश्चित नहीं हैं कि यह एक सरणी है।
# bad
paths = [paths] unless paths.is_a? Array
paths.each { |path| do_something(path) }
# bad (always creates a new Array instance)
[*paths].each { |path| do_something(path) }
# good (and a bit more readable)
Array(paths).each { |path| do_something(path) }
to_aप्रत्येक तर्क को नए सरणी में जोड़ा जाता है, इसलिए Array({id: 100})रिटर्न[[:id, 100]]