আমি এই প্রশ্নের দিকে নজর রেখেছি কিন্তু তবুও Iteable এবং Traversable বৈশিষ্ট্যের মধ্যে পার্থক্য বুঝতে পারি না। কেউ কি ব্যাখ্যা করতে পারেন?
আমি এই প্রশ্নের দিকে নজর রেখেছি কিন্তু তবুও Iteable এবং Traversable বৈশিষ্ট্যের মধ্যে পার্থক্য বুঝতে পারি না। কেউ কি ব্যাখ্যা করতে পারেন?
উত্তর:
এটিকে সহজভাবে বলতে গেলে, পুনরাবৃত্তিকারীরা রাষ্ট্র রাখে, ট্র্যাভারেবলগুলি হয় না।
একজন Traversable
এক বিমূর্ত পদ্ধতি রয়েছে: foreach
। আপনি কল যখন foreach
, সংগ্রহে পাস ফাংশন সব উপাদান এটা রাখে, একের পর এক ভোজন হবে।
অন্যদিকে, একটি Iterable
বিমূর্ত পদ্ধতি আছে iterator
, যা একটি প্রদান করে Iterator
। আপনি কল করতে পারেন next
একটি অন Iterator
আপনার পছন্দসই সময়ে পরবর্তী উপাদান জন্য। আপনি না করা পর্যন্ত এটি সংগ্রহে কোথায় ছিল এবং এরপরে কী আছে তা ট্র্যাক করে রাখতে হবে।
Iterable
প্রসারিত হয় Traversable
, সুতরাং আমি অনুমান করি যে আপনি বোঝাতে চাইছেন Traversable
যেগুলি Iterable
এস নয় ।
Traversable
ইন্টারফেসের সাথে মেনে চলার জন্য রাষ্ট্রের রক্ষণের প্রয়োজন হয় না, যখন Iterator
ইন্টারফেসের সাথে মেনে চলতে হয়।
Traversable
যেগুলি Iterable
কোনও পুনরাবৃত্তি স্থিতি রাখে না। এটি Iterator
তৈরি করে এবং ফিরে আসে Iterable
যা এই রাজ্যকে রাখে।
এটিকে ফুঁকানো এবং চুষার মধ্যে পার্থক্য হিসাবে ভাবেন।
আপনি যখন কোনও Traversable
এস foreach
বা তার উত্পন্ন পদ্ধতিগুলি কল করবেন, এটি একবারে একবারে এটির ক্রিয়াকলাপগুলিতে এর মানগুলি ফুটিয়ে তুলবে - সুতরাং এটির পুনরাবৃত্তির উপর নিয়ন্ত্রণ থাকে।
কিছুক্ষণের মধ্যে Iterator
ফিরে আসার সাথে সাথে Iterable
, আপনি নিজে থেকে পরবর্তীটিতে যাওয়ার সময় নিয়ন্ত্রণ করে এগুলি থেকে মানগুলি স্তন্যপান করেন।
TL; ড Iterables
হয় Traversables
যে stateful তৈরী করতে পারেIterators
প্রথমত, Iterable
এটির সাবট্রাইটটি জেনে নিন Traversable
।
দ্বিতীয়,
Traversable
foreach
পদ্ধতিটি বাস্তবায়নের প্রয়োজন , যা সমস্ত কিছুর দ্বারা ব্যবহৃত হয়।
Iterable
iterator
পদ্ধতিটি বাস্তবায়নের প্রয়োজন , যা সমস্ত কিছুর দ্বারা ব্যবহৃত হয়।
উদাহরণস্বরূপ, এর 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
।
ড্যানিয়েলের উত্তর ভাল লাগছে। আমি এটি নিজের কথায় রাখতে পারি কিনা তা আমাকে দেখতে দিন।
সুতরাং একটি পরিশ্রমযোগ্য আপনাকে একটি পুনরাবৃত্তি দিতে পারে, যা আপনাকে একবারে (পরবর্তী () ব্যবহার করে) উপাদানগুলিকে অবিচ্ছিন্ন করতে দেয় এবং আপনার পছন্দমতো থামিয়ে দেয় এবং যেতে পারে। এটি করার জন্য পুনরাবৃত্তকারীকে উপাদানটির অবস্থানের অভ্যন্তরীণ "পয়েন্টার" রাখতে হবে keep তবে একটি ট্র্যাভারেবল আপনাকে বিনা বাধা ছাড়াই একবারে সমস্ত উপাদানকে অবিচলিত করার পদ্ধতি, পূর্বাভাস দেয়।
পরিসরের মতো কিছু (1, 10) এর ট্র্যাভারেবল হিসাবে রাজ্য হিসাবে কেবল 2 পূর্ণসংখ্যার প্রয়োজন। তবে পরিমার্জনযোগ্য হিসাবে ব্যাপ্তি (1, 10) আপনাকে একটি পুনরাবৃত্তি দেয় যা রাজ্যের জন্য 3 পূর্ণসংখ্যা ব্যবহার করতে হবে, যার মধ্যে একটি সূচক।
ট্র্যাভার্সেবল ফোল্ডলফ্ট, ফোল্ডরাইটও সরবরাহ করে তা বিবেচনা করে, এর পূর্বাভাসকে একটি ज्ञিত এবং স্থির ক্রমে উপাদানগুলি অতিক্রম করতে হবে। সুতরাং ট্র্যাভারেবলের জন্য একটি ইেটরেটর কার্যকর করা সম্ভব। উদাহরণস্বরূপ ডিএফ পুনরুক্তিকারী = toList.iterator
Traversable
মধ্যে Scala 2.13 (এটি এখনও জন্য একটি অননুমোদিত ওরফে যেমন রাখা হয়Iterable
2.14 পর্যন্ত)