স্কেল: স্কালা সংগ্রহগুলিতে ট্র্যাভারেবল এবং আইটারেবল বৈশিষ্ট্যের মধ্যে পার্থক্য কী?


98

আমি এই প্রশ্নের দিকে নজর রেখেছি কিন্তু তবুও Iteable এবং Traversable বৈশিষ্ট্যের মধ্যে পার্থক্য বুঝতে পারি না। কেউ কি ব্যাখ্যা করতে পারেন?


4
সেখানে আর নেই Traversableমধ্যে Scala 2.13 (এটি এখনও জন্য একটি অননুমোদিত ওরফে যেমন রাখা হয় Iterable2.14 পর্যন্ত)
জেভিয়ার Guihot

উত্তর:


122

এটিকে সহজভাবে বলতে গেলে, পুনরাবৃত্তিকারীরা রাষ্ট্র রাখে, ট্র্যাভারেবলগুলি হয় না।

একজন Traversableএক বিমূর্ত পদ্ধতি রয়েছে: foreach। আপনি কল যখন foreach, সংগ্রহে পাস ফাংশন সব উপাদান এটা রাখে, একের পর এক ভোজন হবে।

অন্যদিকে, একটি Iterableবিমূর্ত পদ্ধতি আছে iterator, যা একটি প্রদান করে Iterator। আপনি কল করতে পারেন nextএকটি অন Iteratorআপনার পছন্দসই সময়ে পরবর্তী উপাদান জন্য। আপনি না করা পর্যন্ত এটি সংগ্রহে কোথায় ছিল এবং এরপরে কী আছে তা ট্র্যাক করে রাখতে হবে।


4
তবে Iterableপ্রসারিত হয় Traversable, সুতরাং আমি অনুমান করি যে আপনি বোঝাতে চাইছেন Traversableযেগুলি Iterableএস নয় ।
রবিন সবুজ

4
@ রবিনগ্রিন মানে আমি Traversableইন্টারফেসের সাথে মেনে চলার জন্য রাষ্ট্রের রক্ষণের প্রয়োজন হয় না, যখন Iteratorইন্টারফেসের সাথে মেনে চলতে হয়।
ড্যানিয়েল সি সোব্রাল

10
Traversableযেগুলি Iterableকোনও পুনরাবৃত্তি স্থিতি রাখে না। এটি Iteratorতৈরি করে এবং ফিরে আসে Iterableযা এই রাজ্যকে রাখে।
গ্রাহাম লি

4
এটা লক্ষণীয় যে 2.13 হিসাবে বৈশিষ্ট্য ট্র্যাভার্সেবল হ্রাস করা হয়েছে। স্টিফান জেইগারকে উদ্ধৃত করার জন্য, "ট্র্যাভার্সেবল বিমূর্ততাটি বর্তমান লাইব্রেরিতে তার ওজন বহন করে না এবং সম্ভবত নতুন ডিজাইনে পুনরায় উত্থিত হয় না। আমরা যা করতে চাই তার সমস্ত কিছুই ইটেবলের সাথে প্রকাশ করা যেতে পারে।"
ইগোর উরিশমান

227

এটিকে ফুঁকানো এবং চুষার মধ্যে পার্থক্য হিসাবে ভাবেন।

আপনি যখন কোনও Traversableএস foreachবা তার উত্পন্ন পদ্ধতিগুলি কল করবেন, এটি একবারে একবারে এটির ক্রিয়াকলাপগুলিতে এর মানগুলি ফুটিয়ে তুলবে - সুতরাং এটির পুনরাবৃত্তির উপর নিয়ন্ত্রণ থাকে।

কিছুক্ষণের মধ্যে Iteratorফিরে আসার সাথে সাথে Iterable, আপনি নিজে থেকে পরবর্তীটিতে যাওয়ার সময় নিয়ন্ত্রণ করে এগুলি থেকে মানগুলি স্তন্যপান করেন।


50
জন ব্যক্তিকে এই কলে ব্যবহার ঠেলাঠেলি এবং টেনে পরিবর্তে ফুঁ এবং চুষা , কিন্তু আপনার খোলা মানসিকতার পছন্দ করি।
মার্টিজন

4
আমার পরবর্তী সাক্ষাত্কারে জিজ্ঞাসা করা হলে এটিকে কখনও ভুলে
যাবেন না

24

TL; ড Iterables হয় Traversablesযে stateful তৈরী করতে পারেIterators


প্রথমত, Iterableএটির সাবট্রাইটটি জেনে নিন Traversable

দ্বিতীয়,

  • Traversableforeachপদ্ধতিটি বাস্তবায়নের প্রয়োজন , যা সমস্ত কিছুর দ্বারা ব্যবহৃত হয়।

  • Iterableiteratorপদ্ধতিটি বাস্তবায়নের প্রয়োজন , যা সমস্ত কিছুর দ্বারা ব্যবহৃত হয়।

উদাহরণস্বরূপ, এর implemetation findজন্য Traversableব্যবহারসমূহ foreach(ধী জন্য একটি মাধ্যমে) এবং একটি ছোঁড়ার BreakControlপুনরাবৃত্তির বন্ধ একবার একটি সন্তোষজনক উপাদান পাওয়া গেছে ব্যতিক্রম।

trait TravserableLike {
  def find(p: A => Boolean): Option[A] = {
    var result: Option[A] = None
    breakable {
      for (x <- this)
        if (p(x)) { result = Some(x); break }
    }
    result
  }
}

এর বিপরীতে, Iterableবিয়োগ এই বাস্তবায়ন ও কল অগ্রাহ্য findউপর Iterator, যা কেবল একবার উপাদান পাওয়া যায় iterating বন্ধ হয়ে যায়:

trait Iterable {
  override /*TraversableLike*/ def find(p: A => Boolean): Option[A] =
    iterator.find(p)
}

trait Iterator {
  def find(p: A => Boolean): Option[A] = {
    var res: Option[A] = None
      while (res.isEmpty && hasNext) {
        val e = next()
        if (p(e)) res = Some(e)
      }
    res
  }
}

Traversableপুনরাবৃত্তির জন্য ব্যতিক্রম না ছড়িয়ে ভাল লাগবে , তবে কেবলমাত্র ব্যবহার করার সময় আংশিক পুনরাবৃত্তি করার একমাত্র উপায় foreach

এক দৃষ্টিকোণ থেকে, Iterableআরো দাবিতে / শক্তিশালী বৈশিষ্ট্য, যেমন আপনি সহজেই বাস্তবায়ন করতে পারেন foreachব্যবহার iterator, কিন্তু আপনি সত্যিই বাস্তবায়ন করতে পারবে না iteratorব্যবহার foreach


সংক্ষেপে বলা যায়, Iterableসাময়িক ভাবে থামাতে সারসংকলন, অথবা একটি stateful মাধ্যমে পুনরাবৃত্তির থামাতে একটি উপায় প্রদান করে Iterator। সহ Traversable, এটি সমস্ত বা কিছুই নয় (প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি স্যান)।

বেশিরভাগ সময় এটি গুরুত্ব দেয় না এবং আপনি আরও সাধারণ ইন্টারফেস চাইবেন। তবে যদি আপনার পুনরাবৃত্তির উপর আরও কাস্টমাইজড নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনার একটি দরকার Iteratorযা আপনি একটি থেকে পুনরুদ্ধার করতে পারেন Iterable


1

ড্যানিয়েলের উত্তর ভাল লাগছে। আমি এটি নিজের কথায় রাখতে পারি কিনা তা আমাকে দেখতে দিন।

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

পরিসরের মতো কিছু (1, 10) এর ট্র্যাভারেবল হিসাবে রাজ্য হিসাবে কেবল 2 পূর্ণসংখ্যার প্রয়োজন। তবে পরিমার্জনযোগ্য হিসাবে ব্যাপ্তি (1, 10) আপনাকে একটি পুনরাবৃত্তি দেয় যা রাজ্যের জন্য 3 পূর্ণসংখ্যা ব্যবহার করতে হবে, যার মধ্যে একটি সূচক।

ট্র্যাভার্সেবল ফোল্ডলফ্ট, ফোল্ডরাইটও সরবরাহ করে তা বিবেচনা করে, এর পূর্বাভাসকে একটি ज्ञিত এবং স্থির ক্রমে উপাদানগুলি অতিক্রম করতে হবে। সুতরাং ট্র্যাভারেবলের জন্য একটি ইেটরেটর কার্যকর করা সম্ভব। উদাহরণস্বরূপ ডিএফ পুনরুক্তিকারী = toList.iterator

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