সঠিক উপায় কী:
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 যা বস্তু বা বস্তুর একটি অ্যারে নিতে পারেন একতান বিভিন্ন উপায়ে আছে, তাই, হয় একটি অ্যারের, আমি একটি পরামর্শ আছে।
Splat অপারেটর যাদু প্রচুর রয়েছে আপনি আপ করতে পারেন, অথবা আপনি শুধু কল করতে পারেন 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]"
এবং, গ্রেসচ্লোমকে ধন্যবাদ , এটি কখনও কখনও কেবল ব্যবহারে দ্রুত হয় 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? গণনাযোগ্য, সুতরাং সম্ভবত এটি আপনি যা চান তা নয় ... অবজেক্টের মতো অ্যারের আপনার ধারণার উপর নির্ভর করে।
চেষ্টা করুন:
def is_array(a)
a.class == Array
end
সম্পাদনা : অন্য উত্তরটি আমার চেয়ে অনেক ভাল।
ব্যবহার বিবেচনা করুন 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]]