গণনা, আকার, দৈর্ঘ্য ... রুবিতে অনেক পছন্দ?


140

আমি এটির একটি যথাযথ উত্তর খুঁজে পাচ্ছি না এবং আমি এটি নিশ্চিত করতে চাই যে এটি "n'th স্তর" :-) এ আমি বুঝতে পেরেছি

    a = {"a" => "হ্যালো", "খ" => "বিশ্ব"}
    a.count # 2
    a.size # 2
    দৈর্ঘ্য # 2

    a = [10, 20]
    a.count # 2
    a.size # 2
    দৈর্ঘ্য # 2

তাহলে কোনটি ব্যবহার করবেন? যদি আমি জানতে চাই যে একটিতে একাধিক উপাদান রয়েছে তবে এটি কোনও বিষয় বলে মনে হচ্ছে না তবে আমি নিশ্চিত করতে চাই যে আমি আসল পার্থক্যটি বুঝতে পেরেছি। এটি অ্যারেগুলিতেও প্রযোজ্য। আমি একই ফলাফল পেতে।

এছাড়াও, আমি বুঝতে পারি যে অ্যাক্টিভেকর্ডের সাথে গণনা / আকার / দৈর্ঘ্যের আলাদা অর্থ রয়েছে। আমি এখনই বেশিরভাগ ক্ষেত্রে খাঁটি রুবিতে আগ্রহী (১.৯২) তবে কেউ যদি পার্থক্যটি আঁকতে চায় তবে এআরও প্রশংসিত হবে।

ধন্যবাদ!


5
আপনি যে ঘটনাটির মুখোমুখি হয়েছিলেন তাকে কখনও কখনও টিএমটিওটিডিডিআই বলা হয় : এটি করার একাধিক উপায় রয়েছে ' s এই স্লোগানটি পার্ল সম্প্রদায় থেকে এসেছে এবং পার্ল রুবির অন্যতম প্রভাব।
অ্যান্ড্রু গ্রিম

এগুলি সাধারণত একে অপরের জন্য উপাধি হয় - তারা একই কাজ করে। আপনার মনে রাখতে হবে এমন একটি পদ্ধতি রয়েছে: Array#nitemsযা একটি অ্যারেতে এনআইএল নন আইটেমের সংখ্যা দেয়। তবে এটি রুবি ১.৯-তে আর উপলভ্য নয়
টিলো

উত্তর:


194

অ্যারে এবং হ্যাশগুলির sizeজন্য একটি উপনাম length। এগুলি প্রতিশব্দ এবং ঠিক একই জিনিস করে।

count আরও বহুমুখী - এটি একটি উপাদান নিতে বা শিকারী হতে পারে এবং কেবল মেলে এমন আইটেমগুলি গণনা করতে পারে।

> [1,2,3].count{|x| x > 2 }
=> 1

আপনি যেখানে গণনা করার জন্য কোনও পরামিতি সরবরাহ করেন না সে ক্ষেত্রে এটি কল করার দৈর্ঘ্যের মতোই একই প্রভাব ফেলে effect যদিও পারফরম্যান্সের পার্থক্য থাকতে পারে।

অ্যারের সোর্স কোড থেকে আমরা দেখতে পাচ্ছি যে তারা প্রায় একই জিনিসটি করে। বাস্তবায়নের জন্য এখানে সি কোডটি রয়েছে array.length:

static VALUE
rb_ary_length(VALUE ary)
{
    long len = RARRAY_LEN(ary);
    return LONG2NUM(len);
}

এবং বাস্তবায়ন থেকে এখানে প্রাসঙ্গিক অংশটি রয়েছে array.count:

static VALUE
rb_ary_count(int argc, VALUE *argv, VALUE ary)
{
    long n = 0;

    if (argc == 0) {
        VALUE *p, *pend;

        if (!rb_block_given_p())
            return LONG2NUM(RARRAY_LEN(ary));

        // etc..
    }
}

কোড array.countকিছু অতিরিক্ত চেক করে কিন্তু শেষ পর্যন্ত সঠিক একই কোড কল: LONG2NUM(RARRAY_LEN(ary))

অন্যদিকে হ্যাশগুলি ( উত্স কোড ) তাদের নিজস্ব অনুকূলিত সংস্করণ প্রয়োগ করেছে বলে মনে হয় না ( উত্স কোড ) countথেকে বাস্তবায়ন ব্যবহৃত হয়, যা সমস্ত উপাদানগুলির উপর পুনরাবৃত্তি করে এবং একে একে একে গণনা করে।Enumerable

সাধারণভাবে আমি সম্পূর্ণরূপে কয়টি উপাদান রয়েছে তা জানতে চাইলে বরং length(বা তার নাম size) ব্যবহার করার পরামর্শ দেব count


ActiveRecord সংক্রান্ত অন্যদিকে, সেখানে হয় গুরুত্বপূর্ণ পার্থক্য। এই পোস্টটি দেখুন:


10

অ্যাপ্লিকেশনগুলির জন্য একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে যা ডাটাবেস সংযোগগুলি ব্যবহার করে।

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

কারণ এই ওআরএমগুলি এতটা প্রচলিত আমি ন্যূনতম বিস্ময়ের নীতি অনুসরণ করি। সাধারণভাবে যদি আমার কাছে ইতিমধ্যে মেমরির কিছু থাকে তবে আমি। সাইজ ব্যবহার করি এবং যদি আমার কোড কোনও ডেটাবেজে (বা কোনও এপিআইয়ের মাধ্যমে বাহ্যিক পরিষেবা) একটি অনুরোধ উত্পন্ন করে আমি। অ্যাকাউন্ট ব্যবহার করি।


1
এর সাথে বিবেচনা করার মতো কিছু counter_cache। যদি একটি টেবিল আছে, fooএবং তা has_many bar, আপনি একটি কলাম থাকবে fooনামে bars_countযে পরার আপডেট যে কোন সময় একটি barতৈরি করা হয় / ধ্বংস করেছে। ব্যবহার করা foo.bars.sizeহ'ল সেই কলামটি যা যাচাই করে (আসলে কোনও জিজ্ঞাসা না করে bars)। foo.bars.countপ্রকৃত ক্যোয়ারীটি করে যা ক্যাশের উদ্দেশ্যকে পরাস্ত করবে।
দুডো

7

বেশিরভাগ ক্ষেত্রেই (যেমন এরে বা স্ট্রিং ) sizeএকটি হল ওরফে জন্য length

countসাধারণত আনুমানিক থেকে আসে এবং এটি একটি optionচ্ছিক প্রাকটিক ব্লক নিতে পারে। এভাবে enumerable.count {cond}হয় [মোটামুটিভাবে] (enumerable.select {cond}).length- এটি অন্তর্বর্তী গঠন বাইপাস অবশ্যই যেমন শুধু ম্যাচিং predicates গণনা দরকার পারবেন না।

দ্রষ্টব্য: আমি নিশ্চিত নন যে ব্লকটি সুনির্দিষ্টভাবে নির্দিষ্ট না করা হয়েছে বা যদি এটি সম্ভব হয় তবে এটির শর্ট সার্কিটও যদি গণনার একটি মূল্যায়ন count জোর করেlength

সম্পাদনা করুন (এবং মার্কের উত্তরের জন্য ধন্যবাদ!): count কোনও ব্লক ছাড়াই (কমপক্ষে অ্যারেগুলির জন্য) কোনও মূল্যায়ন জোর করে না । আমি মনে করি আনুষ্ঠানিক আচরণ ছাড়াই এটি অন্যান্য বাস্তবায়নের জন্য "উন্মুক্ত", যদি কোনও প্রাকটিক্যাল ছাড়াই কোনও মূল্যায়ন জোর করে এমনকি এমনকি যেভাবেই বোঝা যায়।


5

আমি http://blog.hasmanythrough.com/2008/2/27/count-leth-size এ একটি ভাল উত্তরওয়ালা পেয়েছি

অ্যাক্টিভেকর্ডে, কোনও সংস্থায় কতগুলি রেকর্ড রয়েছে তা জানার বিভিন্ন উপায় রয়েছে এবং তারা কীভাবে কাজ করে সে সম্পর্কে কিছু সূক্ষ্ম পার্থক্য রয়েছে।

post.comments.count - একটি এসকিউএল COUNT ক্যোয়ারী সহ উপাদানগুলির সংখ্যা নির্ধারণ করুন। আপনি কেবলমাত্র যুক্ত উপাদানগুলির একটি উপসেট গণনা করতে শর্তাদি নির্দিষ্ট করতে পারেন (যেমন: শর্তাবলী => {: লেখক_নাম => "জোশ"})। যদি আপনি অ্যাসোসিয়েশনে একটি কাউন্টার ক্যাশে সেট আপ করেন তবে # অ্যাকাউন্ট একটি নতুন কোয়েরি চালানোর পরিবর্তে সেই ক্যাশেড মানটি ফিরিয়ে দেবে।

post.comments.length - এটি অ্যাসোসিয়েশনের বিষয়বস্তু সর্বদা স্মৃতিতে লোড করে, তারপরে লোড হওয়া উপাদানগুলির সংখ্যা প্রদান করে। মনে রাখবেন যে সমিতিটি পূর্বে লোড করা হয়ে থাকে এবং তারপরে নতুন মন্তব্যগুলি অন্যভাবে পোস্ট করা হয়েছে (যেমন, মন্তব্য.ক্রিয়েট (...) পোস্ট ডটমেন্টস ক্রিয়েট (...)) এর পরিবর্তে update

post.comments.size - এটি আগের দুটি বিকল্পের সংমিশ্রণ হিসাবে কাজ করে। যদি সংগ্রহটি ইতিমধ্যে লোড করা হয়ে থাকে, তবে এটি # দৈর্ঘ্যকে কল করার মতো তার দৈর্ঘ্যটি ফিরে আসবে। এটি এখনও লোড করা না থাকলে এটি # অ্যাকাউন্টে কল করার মতো।

এছাড়াও আমার একটি ব্যক্তিগত অভিজ্ঞতা রয়েছে:

<%= h(params.size.to_s) %> # works_like_that !
<%= h(params.count.to_s) %> # does_not_work_like_that !

2

আমরা মত একটি অ্যারের মধ্যে কতগুলি উপাদান খুঁজে বের করতে একটি একাধিক পদ্ধতি আছে .length, .countএবং .size। তবে এটি ব্যবহার array.sizeকরার চেয়ে ব্যবহার করা ভাল array.count। কারণ .sizeপারফরম্যান্সে আরও ভাল।


1

মার্ক বাইয়ার্সের উত্তরটিতে আরও যোগ করা। রুবিতে পদ্ধতিটি অ্যারে # দৈর্ঘ্যের পদ্ধতিতে array.sizeএকটি উপাধি । এই দুটি পদ্ধতির কোনও ব্যবহারে কোনও প্রযুক্তিগত পার্থক্য নেই। সম্ভবত আপনি পারফরম্যান্সে কোনও পার্থক্য দেখতে পাবেন না। তবে, একই কাজটি করে তবে কিছু অতিরিক্ত কার্যকারিতা অ্যারে # গণনা সহ countarray.count

এটি কিছু শর্তের ভিত্তিতে উপাদানগুলির মোট নম্বর পেতে ব্যবহার করা যেতে পারে। গণনা তিনটি উপায়ে বলা যেতে পারে:

অ্যারে # গণনা # অ্যারেতে উপাদানগুলির সংখ্যা প্রদান করে

অ্যারে # গণনা এন # অ্যারেতে n এর উপাদান থাকা সংখ্যাগুলি প্রদান করে

এরে # গণনা {| আমি | আইভেন? element প্রতিটি উপাদান অ্যারেতে অনুরোধ করা শর্তের ভিত্তিতে গণনা প্রদান করে

array = [1,2,3,4,5,6,7,4,3,2,4,5,6,7,1,2,4]

array.size     # => 17
array.length   # => 17
array.count    # => 17

এখানে তিনটি পদ্ধতিই একই কাজ করে। তবে এখানেই countআকর্ষণীয় হয়ে উঠেছে ।

আমাদের বলুন, আমি অ্যারেতে 2 টির সাথে অ্যারেতে থাকা কত অ্যারে উপাদানগুলি সন্ধান করতে চাই

array.count 2    # => 3

অ্যারের 2 টির মান সহ মোট তিনটি উপাদান রয়েছে।

এখন, আমি 4 টিরও বেশি অ্যারের উপাদানগুলি খুঁজতে চাই

array.count{|i| i > 4}   # =>6

অ্যারেতে মোট 6 টি উপাদান রয়েছে যা 4 এর চেয়ে বেশি।

আমি আশা করি এটি countপদ্ধতি সম্পর্কে কিছু তথ্য দেয় ।

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