রুবি অ্যারে সন্ধান_প্রথম অবজেক্ট?


135

আমি অ্যারে ডকুমেন্টেশনে কিছু মিস করছি? আমার একটি অ্যারে রয়েছে যা নির্দিষ্ট মানদণ্ডকে সন্তুষ্ট করতে এক অবধি অবজেক্টকে ধারণ করে। আমি সেই জিনিসটি দক্ষতার সাথে খুঁজে পেতে চাই। ডক্স থেকে আমার সেরা ধারণাটি হ'ল:

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?

তবে আমি দুটি কারণে অসন্তুষ্ট:

  1. এটি selectআমাকে পুরো অ্যারে ছাড়িয়েছে, যদিও প্রথম হিট হওয়ার পরে আমরা জামিন করতে পারতাম।
  2. প্রার্থীদের সমতল করার জন্য আমার একটি কোড লাইন (একটি শর্ত সহ) প্রয়োজন needed

উভয় ক্রিয়াকলাপ 0 বা 1 সন্তুষ্টিজনক বস্তু আছে তা আগেই জ্ঞানের সাথে অপ্রয়োজনীয়।

আমি যা চাই তা হ'ল কিছু:

array.find_first(block)

যা শূন্য বা প্রথম অবজেক্ট দেয় যার জন্য ব্লকটি সত্যে মূল্যায়ন করে, বস্তুর ট্র্যাভারসাল শেষ করে।

এটা কি আমি নিজেই লিখব? অ্যারেতে থাকা এই সমস্ত দুর্দান্ত পদ্ধতি আমাকে ভাবতে বাধ্য করে যে এটি সেখানে আছে এবং আমি কেবল এটি দেখছি না।

উত্তর:


201

হয় আমি আপনার প্রশ্নটি বুঝতে পারছি না, বা গণনাযোগ্য # সন্ধানটি হ'ল আপনি যা খুঁজছিলেন তা।


32
কোনও সমস্যা নেই, আমি প্রায়শই বিরক্তিকরও পাই যে রুবি ডকুমেন্টেশনগুলি উত্তরাধিকারসূত্রে প্রাপ্ত বা অন্তর্ভুক্ত শ্রেণি এবং মডিউলগুলির পদ্ধতিগুলির তালিকা করে না।
ম্লাদেন জাব্লানোভিć

4
আরও তথ্য: [1,2,3,5,2].find { |n| puts n; n == 2 } এটির সাথে মেলে এমন প্রথম উপাদানটি খুঁজে পেলে পুনরাবৃত্তি থামে।
rajuGT

97

অ্যারে detectপদ্ধতিটি ব্যবহার করুন যদি আপনি প্রথম মানটি ফিরে আসতে চান যেখানে ব্লক সত্য হয়

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

আপনি যদি সমস্ত মান যেখানে ব্লকটি সত্য প্রত্যাবর্তন করতে চান তবে ব্যবহার করুন select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]

5
.detectআমার যা প্রয়োজন ঠিক তা-ই। তবে এর সাথে তফাত কী .find?
অগস্টিন রিডিংগার

13
@ অগাস্টিনরিডিংগার কোন পার্থক্য নেই, উভয়ই সমান। রুবি- ডক.অর্গ.অর্ডারdetectfind
গণনাযোগ্য html# মেমোডি- আই-

কিছু ধারাবাহিকতার জন্য আমি রুবি স্টাইল গাইডটি অনুসরণ করতে চাই , যা
সন্ধানের

20

অনুমান করুন আপনি ডক্সে সন্ধানের পদ্ধতিটি সবেমাত্র মিস করেছেন:

my_array.find {|e| e.satisfies_condition? }

8
বা আপনি যদি কোড গল্ফিং পছন্দ করেনmy_array.find(&:satisfies_condition?)
অ্যান্ড্রু গ্রিম

14

আপনি বস্তুর নিজেই প্রয়োজন অথবা আপনি শুধু যদি জানা প্রয়োজন কি করবেন হল মাফিক একটি বস্তু। যদি প্রাক্তন হয় তবে হ্যাঁ: ব্যবহার সন্ধান করুন:

found_object = my_array.find { |e| e.satisfies_condition? }

অন্যথায় আপনি ব্যবহার করতে পারেন any?

found_it = my_array.any?  { |e| e.satisfies_condition? }

পরেরটি "সত্য" দিয়ে জামিন দেবে যখন শর্তটি সন্তুষ্ট করে এমন একটি এটি পায়। প্রাক্তন একই কাজ করবে, তবে বস্তুটি ফিরিয়ে দেবে।

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