আমি কি জেনারেটরের সাথে ES6 এর তীর ফাংশন সিনট্যাক্স ব্যবহার করতে পারি? (তীর চিহ্ন)


242

অর্থাৎ আমি কীভাবে এটি প্রকাশ করি:

function *(next) {}

তীর সহ আমি যে সমস্ত সংমিশ্রণের কথা ভাবতে পারি তা চেষ্টা করে দেখেছি এবং এটিতে কোনও দলিল খুঁজে পাচ্ছি না।

(বর্তমানে নোড v0.11.14 ব্যবহার করছেন)


5
আপনি পারবেন না। দুঃখিত। " function*স্টেটমেন্ট (ফাংশন কীওয়ার্ড এর পরে একটি নক্ষত্রমুখে) একটি জেনারেটর ফাংশন সংজ্ঞায়িত করে।"

2
নোট করুন যে এসডিসকস.আর.জে এই বিষয়ে কিছুটা দীর্ঘ আলোচনা হয়েছিল ।
voithos

4
আপনি কি আশা param*=>{ }করবেন?
কোডারপি

4
আপনি জানেন যে function(){}একই কাজ করছে না ()=>{}?
কোডারপি

8
" এটি কি সত্য যে ইএস 6 জেনারেটর 2 ধাপ এগিয়ে এবং 1 ধাপ পিছনে? " - না, জেনারেটর কেবল এগিয়ে যেতে পারে :-)
বার্গি

উত্তর:


231

আমি কি জেনারেটরের সাথে ES6 এর তীর ফাংশন সিনট্যাক্স ব্যবহার করতে পারি?

আপনি পারবেন না। দুঃখিত।

এমডিএন অনুসারে

function*বিবৃতি ( functionশব্দ একটি তারকা দ্বারা অনুসরণ) একটি উত্পাদক ফাংশন সংজ্ঞায়িত করে।

একটি নির্দিষ্ট দলিল (আমার জোর) থেকে:

ফাংশন সিনট্যাক্স একটি ঐচ্ছিক যোগ করার জন্য বাড়ানো হয় *টোকেন:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"

175
আমার কাছে ডিজাইনের ত্রুটি মনে হচ্ছে।
জনাথন

23
@ জোনাথন: না। অ্যারো ফাংশনগুলি হালকা ওজনের বলে মনে করা হয় (এবং এর .prototypeউদাহরণ নেই) এবং প্রায়শই ওয়ান-লাইনার থাকে, যখন জেনারেটরগুলি বেশ বিপরীত হয়।
বার্গি 13

38
আমি ইতিমধ্যে কয়েকটি পরিস্থিতি পেরিয়ে গিয়েছি যেখানে আমি আগে জেনারেটরটি পূর্বের প্রয়োজনীয় অ্যাক্সেস নিয়ে খেলছিলাম thisএবং let self = thisজেনারেটরের ভিতরে প্রবেশ করার জন্য হ্যাকটি লিখতে হয়েছিল to লেজিকাল স্কোপ + এ্যার সিনট্যাক্সটি দুর্দান্ত হত। দুর্ভাগ্যজনক, তবে ঠিক পৃথিবীর শেষ নেই।
dvlsg


20
@ বার্গি তীর ফাংশনগুলির পেছনের যুক্তি এর চেয়ে অনেক জটিল। এটা সত্যিই ব্রেভিটি সম্পর্কে নয়। তীর ফাংশনগুলি লাইটওয়েট হওয়া দরকার না - এটি সত্য যে সেখানে optionচ্ছিক একক-বিবৃতি দেহের বাক্য গঠন রয়েছে, তবে কী so শ্রেণি পদ্ধতি ব্যতীত সমস্ত ফাংশন সংজ্ঞাগুলির জন্য অনেক লোক তীর ব্যবহার করে এবং functionকীওয়ার্ডটিকে ভাষার একটি 'খারাপ অংশ' হিসাবে পরিণত করে। এটি করার জন্য ভাল কারণ রয়েছে। এই লোকেদের জন্য তীর জেনারেটরের অভাব একটি বিরক্তিকর অসঙ্গতি।
কলম

131

ইনলাইন-ফাংশন এবং তীর-ফাংশনগুলির মধ্যে পার্থক্য

প্রথমত তীর-ফাংশনগুলি () => {} ইনলাইন-ফাংশনগুলি প্রতিস্থাপনের জন্য তৈরি করা হয় না function(){}এবং সেগুলি পৃথক। ইনলাইন-ফাংশনগুলি কেবল ফাংশন, সুতরাং প্রশ্নটি হ'ল তীর-ফাংশন এবং ইনলাইন-ফাংশনগুলির মধ্যে পার্থক্য কী।

একটি তীর ফাংশন অভিব্যক্তি (এছাড়াও তীর ফাংশন হিসাবে পরিচিত) ফাংশন এক্সপ্রেশন তুলনায় খাটো সিনট্যাক্স এবং বাঁধে না নিজস্ব this, arguments, super, অথবা new.target)। তীর ফাংশন সবসময় বেনামে থাকে।

আরও কিছু দ্রুত বিশদ এখানে


তীর-ফাংশন কেন জেনারেটর হিসাবে ব্যবহার করা যায় না

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

ফলন কীওয়ার্ড ব্যবহার করুন

ফলন শব্দ (যখন ফাংশন এটিকে আরো বেশি মধ্যে নেস্টেড মধ্যে অনুমতি ব্যতীত) একটি তীর ফাংশন শরীরে ব্যবহার করা যাবে না। ফলস্বরূপ, তীর ফাংশনগুলি জেনারেটর হিসাবে ব্যবহার করা যায় না।

লক্ষ্য করুন জেনারেটর ছাড়া yieldমানে হয় না।


তীর-ফাংশন কেন ফলন ব্যবহার করতে পারে না

http://tc39wiki.calculist.org/es6/arrow-functions/

তীর ফাংশন বেঁধে thisআভিধানিক বেঁধে returnমধ্যে ব্লক বডি কেস তাই এটি অবিলম্বে পরিক্ষেপ তীর ফাংশন, এবং প্রতিরোধ থেকে ফেরৎ breakএবং continueঅবিলম্বে পরিক্ষেপ তীর ফাংশন বাহিরে বিবৃতি উল্লেখ করেন।

আইডেন্টিফাইয়ার প্রাথমিক অভিব্যক্তি argumentsএকটি তীর ফাংশন শরীরে ব্যবহার করা যাবে না (কিনা অভিব্যক্তি বা ব্লক ফর্ম)।

তেমনিভাবে yieldতীর ফাংশনের শরীরে ব্যবহার করা যাবে না। তীরগুলি জেনারেটর হতে পারে না এবং আমরা গভীর ধারাবাহিকতা চাই না।

একটি তীর-ফাংশনে ফলন সিনমেটিক ত্রুটি নিক্ষেপ করবে: http://www.ecma-international.org/

শেষ পর্যন্ত কারণটি ইসিএমএ 6 বাস্তবায়নে গভীর জটিলতায় রয়েছে। সি # কিছুটা একই কারণে এটির অনুমতি দেয় না ।


3
আমি একটি অনুসন্ধান ইঞ্জিন ব্যবহার করেছি এবং আপনার জন্য আরও একটি ব্যাখ্যা পোস্ট করেছি
কোডারপি

1
আমি এখনও মনে করি যে এর সাথে ব্যাখ্যা যুক্ত করা ()=>{}অনেক সাহায্য করবে, একটি ইন-লাইন কার্য থেকে তার পার্থক্য বুঝতে এবং জেনারেটরের জন্য কেন সীমাবদ্ধতা রয়েছে তা বুঝতে understand
প্রাণবন্ত- t

63
আমি ঠিক করার চেষ্টা করছি *() => { yield bla; }না কেন , তবে async () => { await bla; }তা ...
লি বেনসন

7
@ কোডেইসির, রে " এবং আমরা গভীর ধারাবাহিকতা চাই না ", উকিল বাহানা ।
পেসারিয়ার

9
আপনার যুক্তি চক্রাকারে। আপনি বলছেন যে তীর ফাংশনগুলি জেনারেটর হতে পারে না কারণ তাদের মধ্যে ফলন কীওয়ার্ড থাকতে পারে না। তবে তাদের ফলন কীওয়ার্ড থাকতে পারে না, কারণ তারা জেনারেটর হতে পারে না: "তীরগুলি জেনারেটর হতে পারে না এবং আমরা গভীর ধারাবাহিকতা চাই না।"
থায়নে

35

উপরে উল্লিখিত নভেম্বর ২০১৩ থেকে এসডিস্কস.অর্গ.এক এবং এ্যাকমা টিসি 39 কমিটির ইএস 6 সভা নোটের উপর আলোচনা ছাড়াও , জেনারেটরের তীরগুলি সেপ্টেম্বর ২০১ 2016 ES7 দুটি সভায় পুনর্বিবেচনা করা হয়েছিল [1] [2] । এই বৈশিষ্ট্যটির জন্য বিভিন্ন সিনট্যাক্সের (মূলত =*>এবং =>*) ন্যায্যতা এবং বিচারের অভাবের বিষয়ে বিভিন্ন উপকারিতা এবং কনস সম্পর্কে আলোচনা করার পরে তারা এই সিদ্ধান্তে পৌঁছে যে:

  • কমিটির পক্ষ থেকে কিছুটা আগ্রহ রয়েছে, তবে উদ্বেগ যে নতুন বৈশিষ্ট্যটি সিনট্যাক্স যুক্ত করার জন্য বৈশিষ্ট্যটির ওজন ধরে না
  • =>*[ডোমেনিক ড্যানিকোলা] এর অ্যাসিঙ্ক পুনরাবৃত্তির প্রস্তাবের অংশ হিসাবে আমরা কমপক্ষে 0 পর্যায়টি পেতে পারি কিনা তা দেখার জন্য 3 য় দিনে পুনর্বিবেচনা করার পরিকল্পনা করুন

জেনারেটরের তীরগুলির প্রস্তাবটি চ্যাম্পিয়ন হিসাবে ব্রেন্ডন আইচ এবং ডোমেনিক ডেনিকোলা সহ প্রথম পর্যায় স্থানান্তরিত করা হয়েছিল । উপরে বর্ণিত অ্যাসিঙ্ক্রোনাস পুনরাবৃত্তিটি 2018 সালে শেষ হয়ে বাস্তবায়িত হয়েছিল।

অক্টোবরে 2019 সালে সের্গেই রুবানভের একটি অফিসিয়াল রেপো সিনট্যাক্স এবং অন্যান্য বিবরণ নিয়ে আরও আলোচনার সাথে উপস্থিত হয়েছিল।


8

আমারও একই প্রশ্ন ছিল এবং এখানে এসেছি। পোস্টগুলি এবং মন্তব্যগুলি পড়ার পরে, আমি অনুভব করেছি যে একটি তীর ফাংশনে জেনারেটরটি ব্যবহার করা অস্পষ্ট বলে মনে হচ্ছে:

const generator = () => 2*3; // * implies multiplication
// so, this would be a confusing
const generator = () =>* something; // err, multiplying?
const generator = () =*> ... // err, ^^
const generator = ()*=> ... // err, *=3, still multiplying?
const generator=*()=> ... // err, ^^
const generator = *param => ... //err, "param" is not fixed word

তীর ফাংশন সম্পর্কিত তারা জেনারেটর বাস্তবায়ন না করায় এটিই বড় কারণ হতে পারে।


তবে, আমি যদি তাদের মধ্যে একজন হতাম তবে আমি এইরকম চিন্তা করতে পারতাম:

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^

এটি আমাদের অ্যাসিক্রোনাস ফাংশনটির মতো অনুভব করে:

const asyncFunction = async () => ... // pretty cool

কারণ, সাধারণ ফাংশন সহ অ্যাসিঙ্ক কীওয়ার্ড বিদ্যমান, সুতরাং তীর ফাংশন এটি ব্যবহার করছে - async () =>সম্ভবত মনে হয় async function()

তবে, genবা এর মতো কোনও কীওয়ার্ড নেই generatorএবং হায় হায় তীর ফাংশন এটি ব্যবহার করছে না।

শেষ করা:

এমনকি তারা তীর ফাংশনে জেনারেটর বাস্তবায়ন করতে চাইলেও, আমি মনে করি তাদের মূল জেএসে জেনারেটর সিনট্যাক্স সম্পর্কে পুনরায় চিন্তা করা দরকার:

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}

এবং এটি একটি বড় ভুল হতে পারে। সুতরাং, জেনারেটর থেকে তীর ফাংশন রাখা, বেশ দুর্দান্ত।


বার্গির মন্তব্য অনুসরণ করছেন :

না। অ্যারো ফাংশনগুলি হালকা ওজন হিসাবে বিবেচিত হয় (এবং উদাহরণস্বরূপ একটি প্রোটোটাইপ নেই) এবং প্রায়শই ওয়ান-লাইনার থাকে, যখন জেনারেটরগুলি বেশ বিপরীত হয়।

আমি বলব যে জেনারেটরের ব্যবহারের উদ্দেশ্যটি রান-স্টপ-রান এবং তাই আমি মনে করি না যে আমাদের প্রোটোটাইপ, লেক্সিকাল ইত্যাদি ইত্যাদি সম্পর্কে যত্ন নেওয়া দরকার don't


2
পছন্দ মতো বিদেশী বিকল্পগুলিও বিবেচনা করতে পারে () ~> { yield 'a'; yield 'b'; }। সত্যি কথা বলতে আমি শুধু টিল্ডসকে ভালবাসি।
Gershom

@Gershom এভাবেই মত প্রোগ্রামিং ভাষায় হয় পার্ল সম্পূর্ণভাবে ভুল হয়ে যেতে পারে
Sapphire_Brick

2

আমি জানি যে এটি খুব দেরি হয়ে গেছে তবে অন্য সম্ভাব্য কারণটি সিনট্যাক্স হতে পারে। সম্ভবত (*() => {})কাজ, কিন্তু কি (9 ** () => {})? এটি কি 9 টি একটি তীর ফাংশনের শক্তিতে ফিরে আসছে NaN, নাকি এটি 9 বারের জেনারেটরের তীর ফাংশনটিও ফিরে আসবে NaN? এটি কিছু বিকল্প বাক্য গঠন সহ করা যেতে পারে, =>*যেমন এখানে অন্য উত্তর দ্বারা উল্লিখিত হয়েছিল, তবে জেনারেটর ফাংশন সিনট্যাক্সের (যেমন, function* () {}এবং { *genMethod() {} }) যখন এটি প্রয়োগ করা হয়েছিল তখন এর ধারাবাহিকতা সংরক্ষণ করার ইচ্ছা ছিল। খুব বেশি অজুহাত নয়, এটির একটি কারণ।


1
: +1: ডাবল নক্ষত্রের জন্য ... পুরানো স্কুল জেএস ছেলে এখানে। কে বলে আপনি কোনও পুরানো কুকুরকে নতুন কৌশল শেখাতে পারবেন না: আনন্দ:
শানিমাল

তারা এটি না করার একমাত্র কারণ, কারণ পার্সার তৈরি করা কঠিন। এটি সম্পূর্ণরূপে সম্ভব এবং সিনট্যাক্সে কোনও আপোষের প্রয়োজন নেই।
জেসন ম্যাককারেল 21

@ জেসনম্যাককারেল যদি তারা পার্সারকে খুব জটিল না করার বিষয়ে যথেষ্ট যত্ন করে থাকে তবে ব্র্যান্ডন আইচের উচিত ছিল ব্রাউজারে স্কিম স্থাপন করা।
নীলা_ব্রীক

1

এই মুহূর্তে আপনি পারবেন না, তবে ভবিষ্যতে আপনি হতে পারেন কারণ টিসি 39 অক্টোবরে 2019 এর জন্য প্রকাশের প্রস্তাব , যা প্রথম পর্যায়ে রয়েছে।


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