রুবি - অ্যারের জন্য পরীক্ষা


265

সঠিক উপায় কী:

is_array("something") # => false         (or 1)

is_array(["something", "else"]) # => true  (or > 1)

বা এটিতে আইটেমের গণনা পেতে?


7
আপনি কি প্রকৃত অ্যারে চান, বা ঠিক অ্যারে-জাতীয় কিছু চান?
ক্যাথি ভ্যান স্টোন

1
রুবিতে কোনও ধরণের সুরক্ষা নেই। আপনার ভেরিয়েবলটি একটি অ্যারে হচ্ছে বা হবে তা নিয়ে চিন্তা করবেন না। পদ্ধতিটি ধরে নেওয়া উচিত যে এটি হয়েছে, এবং এগিয়ে যান এবং এটিতে কল করুন: my_array.count
ব্যবহারকারী 132447

আরও idiomatic রুবির জন্য দয়া করে zgchurch এবং ডিজিটালরোস এর উত্তরগুলি পড়ুন।
ড্যান্ট

উত্তর:


516

আপনি সম্ভবত ব্যবহার করতে চান kind_of()

>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true

31
এছাড়াও আছে is_a?এবং instance_of?স্ট্যাকওভারফ্লো.com
নাথান লং

2
টাইপ চেকিং জাভা জন্য হয়। এগিয়ে যান এবং কেবল ভেরিয়েবলের উপর কল কল করুন। প্রত্যাশা মতো পদ্ধতিটি কাজ করে তা নিশ্চিত করার জন্য ইউনিট পরীক্ষা লিখুন।
ব্যবহারকারী 132447

14
@ ব্যবহারকারী ১৩৪৪4747 আসলে জাভা টাইপ নিরাপদ তাই আপনার কোনও প্রকার পরীক্ষা করার বিষয়ে চিন্তা করার দরকার নেই

8
আমি এখন এটিকে হ্রাস করেছিলাম কারণ আমি মনে করি না যে এটি রুবির মতো ভাষায় এটি একটি ভাল অনুশীলন। @ জেগচর্চ এর উত্তর হ'ল স্পষ্টতই প্রশ্নের অনেক বেশি বুদ্ধিমানের পদ্ধতি। এই জাতীয় ক্ষেত্রে, আমি মনে করি যে অন্ধভাবে তাকে শটগান দেওয়ার চেয়ে ওপিটির অর্থ কী তা বোঝার চেষ্টা করা আরও অনেক বেশি অর্থপূর্ণ হয়েছে ...
প্রতি লুন্ডবার্গ

1
আপনি কেন kind_of?()অন্যান্য সমাধান ব্যবহার করতে চান ? অন্যদের উপর আপনার উত্তরের সুবিধাগুলি সম্পর্কে কিছু ব্যাখ্যা ভবিষ্যতের পাঠকদের জন্য সহায়ক হবে।
AlbertEngelB

148

আপনি কি নিশ্চিত যে এটা করছেন দরকার একটি অ্যারের হবে? আপনি ব্যবহার করতে সক্ষম হবেন respond_to?(method)যাতে আপনার কোডটি অনুরূপ জিনিসগুলির জন্য কাজ করবে যা প্রয়োজনীয়ভাবে অ্যারে হয় না (সম্ভবত কিছু অন্য ভারী জিনিস)। আপনার যদি সত্যিই দরকার হয় arrayতবে Array#kind\_of?পদ্ধতিটি বর্ণনা করার পোস্টটি সবচেয়ে ভাল।

['hello'].respond_to?('each')

1
এই ক্ষেত্রে আমি নিশ্চিত এটি একটি অ্যারে হবে will তবে এই পদ্ধতিটিও জেনে ভাল লাগছে। +1
বাডিজয়

আকর্ষণীয় ধারণা, আমি একটি তথ্য কাঠামোতে পুশ / পপ ব্যবহার করছি। অ্যারে ছাড়াও কি এই পদ্ধতিগুলিতে প্রতিক্রিয়া জানানো হবে?
ড্র

3
আপনি যদি আরও অ্যারে-জাতীয় কিছু চান তবে আপনি চাইতে পারেন respond_to?(:to_ary)
অ্যান্ড্রু গ্রিম

21
সাধারণভাবে, ওও উন্নয়নের জন্য এটি একটি ভাল অনুশীলন। আমি কোথায় পড়েছি যেখানে কেউ কেউ মূলত বলেছিলেন: কল্পনা করবেন না যে আপনি নিজের বস্তুগুলিতে পদ্ধতিগুলি কল করছেন। আপনি তাদের বার্তা প্রেরণ করছেন। যদি কোনও অবজেক্ট আপনার বার্তায় কীভাবে প্রতিক্রিয়া জানাতে জানে, তবে এটি কোন শ্রেণীর, বা এর নামকরণের কোনও পদ্ধতি আছে কিনা, বা এটি পদ্ধতি_মিশিংয়ের মাধ্যমে গতিশীলভাবে কোনও প্রতিক্রিয়া তৈরি করছে কিনা তা আপনার যত্নশীল নয়। গুরুত্বপূর্ণ বিষয়টি হ'ল এটি কী আপনার বার্তাকে সাড়া দিতে পারে? এটি ফাংশন এবং প্রয়োগের আরও ভাল বিমূর্ততা মঞ্জুরি দেয়। আপনি কোন অবজেক্টটি পরে ব্যবহার করেন আপনি তা পরিবর্তন করতে পারবেন যতক্ষণ না এটি এখনও সঠিকভাবে প্রতিক্রিয়া জানায়।
নাথান লং

2
এটির সাথে একমাত্র ইস্যুটি হ'ল আমি যাচাই করতে চাই যে কোনও সূচকযুক্ত পুনরাবৃত্তিযোগ্য কিনা তাই অ্যারে, লিঙ্কযুক্ত তালিকাগুলি ইত্যাদি ভাল লাগবে, তবে আমি কী হ্যাশগুলির মতো মূল মানের দোকানগুলি চাই না?
কল্টন ভয়েজ

58

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কোনও নতুন অবজেক্ট তৈরি করার প্রয়োজন হয় না।


সুতরাং আপনি বলছেন যে এটি যদি কোনও একক আইটেম হয় তবে এটি এটিকে একটি আইটেমের সাথে অ্যারে করে তোলে?
বাডিজে

হ্যাঁ, এবং যদি এটি ইতিমধ্যে একটি অ্যারে হয় তবে এটি দ্বিতীয় অ্যারে মোড়ক না রেখে এটি রাখে।
ডিজিটালরোস

2
ভুলবেন না: [*nil] => []। সুতরাং আপনি একটি খালি অ্যারে শেষ হতে পারে।
ক্রিস্টোফার ওয়েজব্যাক

3
ব্যবহার Array(foo)করা এর চেয়ে অনেক বেশি কার্যকর[*foo]
গ্রেগস্লোম

23

[1,2,3].is_a? Array সত্য মূল্যায়ন।


1
এটি সাইটে প্রায় সাত বছর ধরে থাকা উত্তরগুলিতে কী যুক্ত করে ..?
মার্টিন টর্নয়েজ

6
@ কারপেটসমোকারের এমন কোনও সংক্ষিপ্ত উত্তর নেই যা is_a?এই পুরো থ্রেডের উল্লেখ করে । নিকটতমটি হ'ল ক [1,2,3].is_a? Enumerable। আমি এখনও মনে করি এটি উত্তর পাওয়ার জন্য এটি মূল্যবান।
ডিপোল_মোমেন্ট

4
আপনি জানেন .. আপনি আসলেই ঠিক বলেছেন ... আমি শপথ করতে পেরেছিলাম এটি আগে সেখানে দেখেছি: - / একটি উত্সাহ দিন!
মার্টিন টর্নোজাইজ

16

দেখে মনে হচ্ছে আপনি এমন কিছু পরে আছেন যা সম্পর্কে কিছু ধারণা রয়েছে। আমি এইভাবে যদি এটি দেখতে সুপারিশ করব Enumerable। এটিও অস্তিত্বের নিশ্চয়তা দেয় #count

উদাহরণ স্বরূপ,

[1,2,3].is_a? Enumerable
[1,2,3].count

মনে রাখবেন, যখন size, lengthএবং countঅ্যারে জন্য সব কাজ, countএখানে অর্থ - (উদাহরণস্বরূপ, 'abc'.lengthএবং 'abc'.sizeউভয় কাজ, কিন্তু 'abc'.countযে ভালো কাজ করে না)।

সতর্কতা: একটি স্ট্রিং is_a? গণনাযোগ্য, সুতরাং সম্ভবত এটি আপনি যা চান তা নয় ... অবজেক্টের মতো অ্যারের আপনার ধারণার উপর নির্ভর করে।


11

চেষ্টা করুন:

def is_array(a)
    a.class == Array
end

সম্পাদনা : অন্য উত্তরটি আমার চেয়ে অনেক ভাল।


6

ব্যবহার বিবেচনা করুন 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]]
ব্রেন্ট করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.