রুবিতে মানচিত্র এবং সংগ্রহের মধ্যে পার্থক্য?


426

আমি এটি গুগল করেছি এবং প্যাচী / বিপরীত মতামত পেয়েছি - রুবি / রেলগুলিতে অ্যারের উপর একটি করা mapএবং করার মধ্যে আসলে কোনও পার্থক্য আছে collectকি?

ডক্স কোনো সুপারিশ বলে মনে হচ্ছে না, কিন্তু সম্ভবত পদ্ধতি বা কর্মক্ষমতা পার্থক্য কি?



1
mapকোডগল্ফে কেন কেন প্রাধান্য দেওয়া হয়েছে তার ব্যাখ্যা হিসাবে , যা সবার পক্ষে সুস্পষ্ট নাও হতে পারে: এটি কেবল কারণ collectচারটি অক্ষরের চেয়ে দীর্ঘ map, তবে কার্যক্ষমতায় একই।
জোহেম শুলেনক্লোপার

2
কেবল শয়তানের উকিল খেলতে, আমি ব্যক্তিগতভাবে collectআরও পঠনযোগ্য এবং প্রাকৃতিক খুঁজে পাই - 'রেকর্ড সংগ্রহ করা' এবং তাদের সাথে এক্স করার ধারণা আমার কাছে 'ম্যাপিং' রেকর্ডিং করা এবং তাদের সাথে এক্স করার চেয়ে বেশি প্রাকৃতিক বোধ তৈরি করে।
স্কিরিস

উত্তর:


479

কোনও পার্থক্য নেই, প্রকৃতপক্ষে mapসি হিসাবে প্রয়োগ করা হয়েছে rb_ary_collectএবং enum_collect(যেমন: mapএকটি অ্যারে এবং অন্য কোনও এনামের মধ্যে পার্থক্য রয়েছে, তবে mapএবং এর মধ্যে কোনও পার্থক্য নেই collect)।


রুবিতে কেন mapএবং উভয়ই collectবিদ্যমান? mapফাংশন বিভিন্ন ভাষায় অনেক নামকরণ নিয়মাবলী হয়েছে। উইকিপিডিয়া একটি ওভারভিউ সরবরাহ করে :

মানচিত্রের ক্রিয়াকলাপটি কার্যকরী প্রোগ্রামিং ভাষায় উদ্ভূত হয়েছে তবে বর্তমানে এটি অনেকগুলি প্রক্রিয়াগত, অবজেক্ট ওরিয়েন্টেড এবং বহু-দৃষ্টান্তমূলক ভাষায় সমর্থিত (বা সংজ্ঞায়িতও হতে পারে): সি ++ এর স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরিতে, এটি transformসি # (3.0) এর মধ্যে বলা হয় লিনকু লাইব্রেরি, এটি বলা একটি এক্সটেনশন পদ্ধতি হিসাবে সরবরাহ করা হয় Select। পার্ল, পাইথন এবং রুবির মতো উচ্চ স্তরের ভাষাগুলিতেও মানচিত্রটি প্রায়শই ব্যবহৃত অপারেশন; অপারেশন mapএই তিনটি ভাষায় বলা হয়। রুবিতে (স্মার্টটাক থেকে) [জোর দেওয়া খনি] মানচিত্রের একটি collectউপাধি সরবরাহ করা হয়েছে । কমন লিস্প ম্যাপের মতো ফাংশনগুলির একটি পরিবার সরবরাহ করে; এখানে বর্ণিত আচরণের সাথে সম্পর্কিতটিকে বলা হয় mapcar(সিএআর অপারেশন ব্যবহার করে অ্যাক্সেস নির্দেশ করে কার)।

ঘরে বসে আরও বেশি কিছু অনুভব করার জন্য রুবি স্মার্টটাক ওয়ার্ল্ডের প্রোগ্রামারদের জন্য একটি উপনাম সরবরাহ করে।


অ্যারে এবং এনামগুলির জন্য কেন পৃথক বাস্তবায়ন হয়? একটি এনাম একটি সাধারণ পুনরাবৃত্তি কাঠামো, যার অর্থ রুবি পরবর্তী উপাদানগুলি কী হতে পারে তার পূর্বাভাস দিতে পারে এমন কোনও উপায় নেই (আপনি অসীম এনামগুলি সংজ্ঞায়িত করতে পারেন, উদাহরণের জন্য প্রধানমন্ত্রী দেখুন ) see সুতরাং প্রতিটি ক্রমাগত উপাদান পেতে এটি একটি ফাংশন কল করতে হবে (সাধারণত এটি eachপদ্ধতি হবে)।

অ্যারেগুলি সর্বাধিক সাধারণ সংগ্রহ তাই তাদের কার্যকারিতাটি অনুকূল করা যুক্তিসঙ্গত। যেহেতু রুবি অ্যারে কীভাবে কাজ করে সে সম্পর্কে অনেক কিছু জানেন যে এটি কল eachকরতে হবে না তবে কেবলমাত্র সরল পয়েন্টার ম্যানিপুলেশন ব্যবহার করতে পারেন যা উল্লেখযোগ্যভাবে দ্রুত।

একই অপ্টিমাইজেশন মতো বিন্যাস পদ্ধতি একটি সংখ্যা জন্য অস্তিত্ব zipবা count


13
@ মার্ক রিড তবে তারপরে, স্মার্টটাক থেকে আগত প্রোগ্রামাররা দু'টি আলাদা ফাংশন রাখার কারণে বিভ্রান্ত হবে, যা কেবলমাত্র এলিয়াস হতে পারে। এটি ওপরের মতো ওপরের মতো প্রশ্ন তৈরি করে।
সাসকিউ

10
@ সাসকিউ আমি দ্বিমত পোষণ করি না - আমি মনে করি কেবলমাত্র একটি নাম থাকলে এটি সামগ্রিকভাবে ভাল হবে। তবে রুবিতে প্রচুর পরিমাণে অন্যান্য এলিয়াস রয়েছে এবং আলিয়াসের একটি বৈশিষ্ট্য হ'ল অপারেশনগুলির মধ্যে সংগ্রহ করা , সনাক্তকরণ , ইনজেকশন , প্রত্যাখ্যান করা এবং নির্বাচন করা (অন্যথায় মানচিত্র , সন্ধান , হ্রাস , প্রত্যাখ্যান (কোনও উপনাম নয় ), এবং সন্ধান_ সব )।
মার্ক রিড

4
প্রকৃতপক্ষে. স্পষ্টতই, রুবি আরও অনেক ক্ষেত্রে উপমা / প্রতিশব্দ ব্যবহার করছে। উদাহরণস্বরূপ, যদি একটি অ্যারের মধ্যে উপাদানের সংখ্যা সঙ্গে পুনরায় উদ্ধার করা যাবে count, lengthবা, size। একটি অ্যারের একই অ্যাট্রিবিউট জন্য ভিন্ন শব্দ, কিন্তু এই দ্বারা, রুবি আপনি আপনার কোড সবচেয়ে শব্দ বাছাই করতে সক্ষম হবেন: আপনি চাও সংখ্যা আইটেম তুমি সংগ্রহ, দৈর্ঘ্য একটি অ্যারের, বা বর্তমান আকার এর গঠন. মূলত, তারা সব একই, তবে সঠিক শব্দটি বাছাই করা আপনার কোডটি পড়া সহজতর করতে পারে, যা ভাষার একটি দুর্দান্ত সম্পত্তি।
জোহেম শুলেনক্লাপ্পার

51

আমাকে বলা হয়েছে তারা একই রকম।

প্রকৃতপক্ষে এগুলি রুবি-ডক.org এর অধীনে একই জায়গায় নথিভুক্ত করা হয়েছে:

http://www.ruby-doc.org/core/classes/Array.html#M000249

  • ary.collect {| আইটেম | ব্লক} → new_ary
  • ary.map {| আইটেম | ব্লক} → new_ary
  • ary.collect → an_enumerator
  • ary.map → an_enumerator

স্ব প্রতিটি উপাদানের জন্য একবার ব্লক আহ্বান। ব্লকের দ্বারা প্রদত্ত মানগুলি সহ একটি নতুন অ্যারে তৈরি করে। এছাড়াও গণনাযোগ্য # সংগ্রহ দেখুন।
যদি কোনও ব্লক না দেওয়া হয় তবে পরিবর্তে একটি গণক ফেরত দেওয়া হবে।

a = [ "a", "b", "c", "d" ]
a.collect {|x| x + "!" }   #=> ["a!", "b!", "c!", "d!"]
a                          #=> ["a", "b", "c", "d"]


13

এই প্রশ্নের চেষ্টা করে উত্তর দেওয়ার জন্য আমি একটি বেঞ্চমার্ক পরীক্ষা করেছি, তারপরে এই পোস্টটি পেয়েছি তাই এখানে আমার অনুসন্ধানগুলি রয়েছে (যা অন্যান্য উত্তরগুলির চেয়ে কিছুটা পৃথক)

মানদণ্ডের কোডটি এখানে:

require 'benchmark'

h = { abc: 'hello', 'another_key' => 123, 4567 => 'third' }
a = 1..10
many = 500_000

Benchmark.bm do |b|
  GC.start

  b.report("hash keys collect") do
    many.times do
      h.keys.collect(&:to_s)
    end
  end

  GC.start

  b.report("hash keys map") do
    many.times do
      h.keys.map(&:to_s)
    end
  end

  GC.start

  b.report("array collect") do
    many.times do
      a.collect(&:to_s)
    end
  end

  GC.start

  b.report("array map") do
    many.times do
      a.map(&:to_s)
    end
  end
end

এবং আমি যে ফলাফল পেয়েছি তা হ'ল:

                   user     system      total        real
hash keys collect  0.540000   0.000000   0.540000 (  0.570994)
hash keys map      0.500000   0.010000   0.510000 (  0.517126)
array collect      1.670000   0.020000   1.690000 (  1.731233)
array map          1.680000   0.020000   1.700000 (  1.744398) 

সম্ভবত একটি উপনাম বিনামূল্যে না?


1
এই পার্থক্যগুলি তাৎপর্যপূর্ণ কিনা তা আমি নিশ্চিত নই। একটি পুনর্বিবেচনায় আমি গতিতে বিভিন্ন ফলাফল পেয়েছি (যদিও আপনার হ্যাশ সংগ্রহ করা ধীর বলে মনে হচ্ছে, আপনার অ্যারে
সংগ্রহটি

10

collectএবং collect!পদ্ধতি alias লেখা হয় mapএবং map!, তাই তারা অদলবদল করে ব্যবহার করা যাবে। এটি নিশ্চিত করার জন্য এখানে একটি সহজ উপায়:

Array.instance_method(:map) == Array.instance_method(:collect)
 => true

7

রুবি অ্যালাইস পদ্ধতিটি অ্যারে # অ্যারে মানচিত্রটি সংগ্রহ করে; এগুলি বিনিময়যোগ্যভাবে ব্যবহার করা যায়। (রুবি সন্ন্যাসী)

অন্য কথায়, একই উত্স কোড:

               static VALUE
rb_ary_collect(VALUE ary)
{
long i;
VALUE collect;

RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
collect = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
    rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i)));
}
return collect;
}

http://ruby-doc.org/core-2.2.0/Array.html#method-i-map


4
আমি চাইছি যে ডকুমেন্টেশনটি স্পষ্টভাবে বলা হয়েছে যে তারা আলিয়াস রয়েছে। এই মুহুর্তে তারা কেবল একে অপরকে রেফারেন্স করে এবং উভয়ের মধ্যে কিছুটা আলাদা বর্ণনা রয়েছে।
ক্রিস ব্লুম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.