জাভাস্ক্রিপ্ট ES6 এ, একটি পুনরাবৃত্তিযোগ্য এবং পুনরাবৃত্তির মধ্যে পার্থক্য কী?


14

একটি পুনরাবৃত্তকারী একটি পুনরুক্তি হিসাবে একই, বা তারা পৃথক?

স্পেসিফিকেশন থেকে মনে হয়, একটি পুনরাবৃত্তিযোগ্য একটি বস্তু, বলুন, objযেমন obj[Symbol.iterator]কোনও ফাংশনকে বোঝায়, যাতে যখন আহ্বান করা হয় তখন এমন কোনও বস্তু ফিরে আসে যা এমন কোনও nextপদ্ধতিতে থাকে যা কোনও বস্তুকে ফেরত দিতে পারে {value: ___, done: ___}:

function foo() {
    let i = 0;
    const wah = {
        next: function() {
            if (i <= 2) return { value: (1 + 2 * i++), done: false }
            else return { value: undefined, done: true }
        }
    };
    return wah;     // wah is iterator
}

let bar = {}        // bar is iterable

bar[Symbol.iterator] = foo;

console.log([...bar]);             // [1, 3, 5]   
for (a of bar) console.log(a);     // 1 3 5 (in three lines)

তাই উপরের কোড এ, bariterable, এবং wahপুনরুক্তিকারীর, এবং next()পুনরুক্তিকারীর ইন্টারফেস।

সুতরাং, পুনরাবৃত্তিযোগ্য এবং পুনরাবৃত্তি পৃথক জিনিস।

এখন, জেনারেটর এবং পুনরুদ্ধারের সাধারণ উদাহরণে:

function* gen1() {
    yield 1;
    yield 3;
    yield 5;
}

const iter1 = gen1();

console.log([...iter1]);                           // [1, 3, 5]
for (a of iter1) console.log(a);                   // nothing

const iter2 = gen1();
for (a of iter2) console.log(a);                   // 1 3 5 (in three lines)

console.log(iter1[Symbol.iterator]() === iter1);   // true

উপরের ক্ষেত্রে, gen1জেনারেটর এবং iter1এটি পুনরুক্তিকারী এবং iter1.next()সঠিক কাজটি করবে। কিন্তু iter1[Symbol.iterator]একটি ফাংশন দেয় যা, যখন আহ্বান করা হয়, ফিরে দেয় iter1, যা একটি পুনরাবৃত্তি হয়। সুতরাং iter1এই ক্ষেত্রে একটি পুনরাবৃত্ত এবং পুনরুক্তি উভয় হয়?

এছাড়া iter1, কারণ iterable উদাহরণ 1 দিতে পারেন উপরের উদাহরণে 1 থেকে ভিন্ন [1, 3, 5]হিসেবে ব্যবহার চেয়েছিলেন অনেকবার হিসাবে [...bar]সময়, iter1একটি iterable, কিন্তু যেহেতু এটি নিজেই ফেরৎ, যা একই পুনরুক্তিকারীর প্রত্যেক সময়, শুধুমাত্র দেব [1, 3, 5]একবার।

সুতরাং আমরা বলতে পারি, পুনরাবৃত্তির জন্য bar, [...bar]ফলাফলটি কতবার দিতে পারে [1, 3, 5]- এবং উত্তরটি হ'ল এটি নির্ভর করে। এবং পুনরাবৃত্ত একটি পুনরুক্তি হিসাবে একই? এবং উত্তরটি হ'ল, এগুলি ভিন্ন জিনিস, তবে এগুলি একই হতে পারে, যখন পুনরাবৃত্তকারী নিজেকে পুনরুক্তি হিসাবে ব্যবহার করে। এটা কি ঠিক?


নিবিড়ভাবে সম্পর্কিত: জাভা
স্ক্রিপ্টের

" সুতরাং iter1এই ক্ষেত্রে একটি পুনরাবৃত্ত এবং পুনরুক্তি উভয়? " - হ্যাঁ। সমস্ত দেশীয় পুনরাবৃত্তকারীরা নিজেরাই ফিরে আসার মাধ্যমে পুনরাবৃত্ত হয়, যাতে আপনি সহজেই তাদের পুনরায় পুনঃনির্মাণের প্রত্যাশা করে এমন কন্সট্রাক্টে পাস করতে পারেন।
বার্গি

উত্তর:


10

হ্যাঁ, iterables এবং iterators ভিন্ন জিনিস, কিন্তু (যেমন থেকে বেশী জাভাস্ক্রিপ্ট নিজেই থেকে পেতে সব সহ, সবচেয়ে iterators keysবা valuesউপর পদ্ধতি Array.prototypeথেকে উত্তরাধিকারী জেনারেটরের ফাংশন থেকে বা জেনারেটর) % IteratorPrototype% বস্তুর , যা একটি হয়েছে Symbol.iteratorমত পদ্ধতি এই:

[Symbol.iterator]() {
    return this;
}

ফলাফলটি হ'ল সমস্ত মানক পুনরুক্তিগুলিও পুনরাবৃত্ত হয়। এটি তাই আপনি এগুলি সরাসরি ব্যবহার করতে পারেন, বা এগুলি for-ofলুপগুলিতে ব্যবহার করতে পারেন (যা পুনরাবৃত্তকারীগুলির প্রত্যাশা করে, পুনরাবৃত্তকারী নয়)।

keysঅ্যারের পদ্ধতিটি বিবেচনা করুন : এটি অ্যারের পুনরুক্তি করে যা অ্যারের কীগুলি (তার সূচকগুলি, সংখ্যা হিসাবে) পরিদর্শন করে। দ্রষ্টব্য যে এটি একটি পুনরাবৃত্তি প্রদান করে । তবে এর সাধারণ ব্যবহার হ'ল:

for (const index of someArray.keys()) {
    // ...
}

for-ofএকটি পুনরাবৃত্তযোগ্য লাগে , একটি পুনরুক্তিকারী নয় , সুতরাং কেন এটি কাজ করে?

এটি কাজ করে কারণ পুনরুক্তিও পুনরাবৃত্ত হয়; Symbol.iteratorশুধু ফিরে this

এখানে আমি আমার বইয়ের Chapter ষ্ঠ অধ্যায়টিতে একটি উদাহরণ ব্যবহার করছি: আপনি যদি সমস্ত এন্ট্রিগুলি লুপ করতে চান তবে প্রথমটিটি এড়িয়ে যান এবং আপনি sliceসাবসেটটি কাটাতে ব্যবহার করতে না চান , আপনি পুনরুক্তি পেতে পারেন, প্রথম মানটি পড়তে পারেন, তারপরে একটি for-ofলুপে হাত দিন :

const a = ["one", "two", "three", "four"];
const it = a[Symbol.iterator]();
// Skip the first one
it.next();
// Loop through the rest
for (const value of it) {
    console.log(value);
}

নোট করুন যে এটি সমস্ত স্ট্যান্ডার্ড পুনরাবৃত্তকারী। কিছু সময় লোকেরা ম্যানুয়ালি কোডেড পুনরাবৃত্তির উদাহরণগুলি দেখায়:

পুনরুক্তিকারীর ফিরে দ্বারা rangeআছে না একটি iterable, তাই এটি ব্যর্থ হলে আমরা সঙ্গে এটি ব্যবহার করার চেষ্টা for-of

এটি পুনরাবৃত্তিযোগ্য করতে, আমাদের প্রয়োজন হয়:

  1. Symbol.iteratorউপরের উত্তরের শুরুতে এটিতে পদ্ধতিটি যুক্ত করুন , বা
  2. এটি% আইট্রেটারপ্রোটোটাইপ% থেকে উত্তরাধিকারী করুন, যার ইতিমধ্যে সেই পদ্ধতি রয়েছে

দুঃখের বিষয়, টিসি 39% ইটেটরপ্রোটোটাইপ% অবজেক্টটি পাওয়ার সরাসরি উপায় না দেওয়ার সিদ্ধান্ত নিয়েছে। একটি অপ্রত্যক্ষ উপায় আছে (একটি অ্যারের থেকে পুনরুদ্ধারকারী পাওয়া, তার প্রোটোটাইপ গ্রহণ করা, যা% IteratorPrototype% হিসাবে সংজ্ঞায়িত করা হয়), তবে এটি একটি ব্যথা।

তবে যেভাবে যাই হোক না কেন ম্যানুয়ালি পুনরুক্তি লেখার দরকার নেই; কেবল একটি জেনারেটর ফাংশন ব্যবহার করুন, যেহেতু এটি জেনারেটরের ফেরত দেয় তা পুনরাবৃত্ত হয়:


বিপরীতে, সমস্ত পুনরাবৃত্তকারীগুলি পুনরাবৃত্তকারী নয়। অ্যারেগুলি পুনরাবৃত্তিযোগ্য তবে পুনরাবৃত্তকারী নয়। স্ট্রিংস, মানচিত্র এবং সেটগুলিও তাই।


0

আমি দেখতে পেয়েছি যে শর্তগুলির আরও কিছু সুনির্দিষ্ট সংজ্ঞা রয়েছে এবং এগুলি আরও নির্দিষ্ট উত্তর:

মতে ES6 চশমা এবং MDN :

যখন আমরা আছে

function* foo() {   // note the "*"
    yield 1;
    yield 3;
    yield 5;
}

fooজেনারেটর ফাংশন বলা হয় । এবং তারপর আমরা যখন

let bar = foo();

barএকটি জেনারেটর অবজেক্ট । এবং একটি জেনারেটর অবজেক্ট পুনরাবৃত্ত প্রোটোকল এবং পুনরাবৃত্তকারী প্রোটোকল উভয়কেই মেনে চলে

সহজ সংস্করণটি পুনরাবৃত্ত ইন্টারফেস যা কেবল একটি .next()পদ্ধতি।

পুনরাবৃত্তিযোগ্য প্রোটোকলটি হ'ল: অবজেক্টের জন্য obj, obj[Symbol.iterator]"শূন্য আর্গুমেন্ট ফাংশন দেয় যা কোনও বস্তুকে ফেরত দেয় , এটিরেটর প্রোটোকলের সাথে সামঞ্জস্য করে"।

দ্বারা MDN লিংক শিরোনাম , এটি মনে হয় আমরা শুধু কল করতে পারেন জেনারেটরের একটি "জেনারেটর" বস্তু।

দ্রষ্টব্য যে নিকোলাস জাকাসের ECMAScript 6 বোঝার বইটিতে তিনি সম্ভবত "জেনারেটর" হিসাবে একটি "জেনারেটর ফাংশন" এবং একটি "জেনারেটর অবজেক্ট" হিসাবে " পুনরায় যন্ত্র " হিসাবে ডেকেছিলেন। টেক অফ পয়েন্টটি হ'ল, তারা সত্যই উভয় "জেনারেটর" সম্পর্কিত - একটি জেনারেটর ফাংশন এবং একটি হ'ল জেনারেটর অবজেক্ট, বা জেনারেটর। জেনারেটর অবজেক্ট পুনরাবৃত্তযোগ্য প্রোটোকল এবং পুনরাবৃত্তকারী প্রোটোকল উভয়কেই মেনে চলে।

যদি এটি কেবল আয়রেটর প্রোটোকলের সাথে মানিয়ে নেওয়া হয় তবে আপনি ব্যবহার করতে পারবেন না[...iter] বা for (a of iter)। এটি এমন একটি বস্তু হতে হবে যা পুনরাবৃত্ত প্রোটোকলের সাথে সামঞ্জস্য করে।

এবং তারপরে, ভবিষ্যতে জাভাস্ক্রিপ্ট স্পেসে একটি নতুন আইট্রেটার শ্রেণি রয়েছে যা এখনও একটি খসড়াটিতে রয়েছে । এটা যেমন যেমন পদ্ধতি সহ একটি বৃহত্তর ইন্টারফেস, হয়েছে forEach, map, reduceবর্তমান এরে ইন্টারফেস, এবং যেমন ও নতুন কিছু, এর take, এবং drop। বর্তমান পুনরুক্তিকারী কেবল nextইন্টারফেসের সাহায্যে অবজেক্টটিকে বোঝায় ।

মূল প্রশ্নের উত্তর দেওয়ার জন্য: একটি পুনরাবৃত্তকারী এবং একটি পুনরাবৃত্তযোগ্য এর মধ্যে পার্থক্য কী, উত্তরটি হল: একটি পুনরুক্তি করা ইন্টারফেসের সাথে একটি বস্তু .next(), এবং একটি পুনরাবৃত্তযোগ্য এমন একটি বস্তু objযা obj[Symbol.iterator]শূন্য-আর্গুমেন্ট ফাংশন দিতে পারে, যখন অনুরোধ করা হয়, একটি পুনরাবৃত্তি প্রদান করে।

এবং একটি জেনারেটর উভয়ই একটি পুনরাবৃত্ত এবং পুনরুক্তিকারী এটি যুক্ত করতে।

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