ES6 / টাইপস্ক্রিপ্টে তীর ফাংশন সহ _ (আন্ডারস্কোর) পরিবর্তনশীল ব্যবহার করা


119

আমি এই নির্মাণটি একটি কৌণিক উদাহরণে এসেছি এবং কেন আমি এটি বেছে নিলাম তা অবাক করি:

_ => console.log('Not using any parameters');

আমি বুঝতে পারি যে ভেরিয়েবল _ এর অর্থ যত্নশীল / ব্যবহৃত হয় না তবে এটি কেবলমাত্র ভেরিয়েবল তাই _ ওভার ব্যবহারকে পছন্দ করার কোনও কারণ আছে:

() => console.log('Not using any parameters');

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

(_: any) => console.log('Not using any parameters');

যদি এটি গুরুত্বপূর্ণ হয় তবে এটি প্রসঙ্গটি যেখানে এটি ব্যবহৃত হয়েছিল:

submit(query: string): void {
    this.router.navigate(['search'], { queryParams: { query: query } })
      .then(_ => this.search());
}


1
যে প্যারামিটারটি কখনও ব্যবহার করা হয় না তার জন্য টাইপিং বা নির্দিষ্টতা টাইপ করার বিষয়ে আপনি কীভাবে চিন্তিত হতে পারেন?

3
আমি বাণিজ্যের দ্বারা একজন সি ++ বিকাশকারী তাই আমার ধারণা আমি টাইপ নির্দিষ্টতা :-) সম্পর্কে সর্বদা উদ্বিগ্ন।
হল্ট

6
ব্যক্তিগতভাবে, _ => প্যাটার্ন বন্ধনীর সংখ্যা হ্রাস করে এটি পড়া সহজ করে তোলে: doStuff ()। তারপর (() => ক্রিয়া ()) বনাম doStuff () তারপর (_ => ক্রিয়া ())।
ডেমিয়েন গোল্ডিং

উত্তর:


93

কেন এই স্টাইলটি ব্যবহার করা যেতে পারে (এবং সম্ভবত এটি কেন এখানে ব্যবহার করা হয়েছিল) এটি তার _চেয়ে একটি চরিত্রের চেয়ে ছোট ()

Alচ্ছিক বন্ধনীগুলি style চ্ছিক কোঁকড়ানো বন্ধনী হিসাবে একই স্টাইল ইস্যুতে পড়ে । এটি বেশিরভাগ অংশের জন্য স্বাদ এবং কোড শৈলীর বিষয়, তবে ধারাবাহিকতার কারণে ভার্বোসিটি এখানে অনুকূল।

তীর ফাংশনগুলি প্রথম বন্ধনী ছাড়াই একক প্যারামিটারকে মঞ্জুরি দেয়, এটি শূন্য, একক কাঠামোগত, একক বিশ্রাম এবং একাধিক পরামিতিগুলির সাথে সঙ্গতিপূর্ণ নয়:

let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };

যদিও আন্ডারকর্ডেড প্যারামিটারগুলির জন্য টাইপস্ক্রিপ্ট ২.০ এis declared but never used ত্রুটি ঠিক করা হয়েছিল , তবে একটি ল্যাটার বা আইডিই থেকে সতর্কতা _ট্রিগার করতে পারে unused variable/parameter। এটি করার বিরুদ্ধে এটি যথেষ্ট যুক্তিযুক্ত।

_উপেক্ষা করা পরামিতিগুলির জন্য প্রচলিতভাবে ব্যবহার করা যেতে পারে (অন্য উত্তর ইতিমধ্যে ব্যাখ্যা করা হয়েছে)। যদিও এটি গ্রহণযোগ্য হিসাবে বিবেচিত হতে পারে তবে এই অভ্যাসটি _ইন্ডোরকোর্ড / লোডাশ নেমস্পেসের সাথে দ্বন্দ্বের কারণ হতে পারে এবং একাধিক অবহেলিত প্যারামিটার থাকলে বিভ্রান্ত দেখায়। এই কারণে আন্ডারস্কোরড প্যারামিটারগুলি সঠিকভাবে নামকরণ (টিএস ২.০ এ সমর্থিত) রাখা সুবিধাজনক, ফাংশন স্বাক্ষর সনাক্তকরণ এবং পরামিতিগুলিকে কেন উপেক্ষা করা হয়েছে তা চিহ্নিত করার ক্ষেত্রে সময় সাশ্রয় হয় (এটি _একটি শর্টকাট হিসাবে প্যারামিটারের উদ্দেশ্যকে অস্বীকার করে ):

let fn = (param1, _unusedParam2, param3) => { ... };

উপরে তালিকাভুক্ত কারণে, আমি ব্যক্তিগতভাবে _ => { ... }কোড শৈলীর একটি খারাপ স্বর বিবেচনা করব যা এড়ানো উচিত।


1
এটি একটি চরিত্রের চেয়ে ছোট, তবে বেশিরভাগ আইডিই-র জন্য এটি একই পরিমাণ কীপ্রেস, যেহেতু (সাধারণত টিপলে এটি এ আসে )। আমি ব্যক্তিগতভাবে pপ্যারামিটারটি ব্যবহার করতে পছন্দ করি, আমি আরও আশ্চর্য হই যে এটির কোনও পারফরম্যান্স সমস্যা আছে কিনা
মোজিমি

68

()সিনট্যাক্স অভিপ্রায় ভাল এই প্রোগ্রামটিতে conveys এবং আরো টাইপ নির্দিষ্ট

বেপারটা এমন না. ()বলেছেন যে ফাংশনটি কোনও যুক্তি প্রত্যাশা করে না, এটি কোনও পরামিতি ঘোষণা করে না। ফাংশনটি .length0 হয়।

আপনি যদি ব্যবহার করেন তবে _এটি স্পষ্টতই বলেছে যে ফাংশনটি একটি যুক্তি দিয়ে দেওয়া হবে, তবে আপনি এটি সম্পর্কে চিন্তা করবেন না। ফাংশনটি .length1 হবে, যা কিছু ফ্রেমওয়ার্কের ক্ষেত্রে গুরুত্বপূর্ণ।

সুতরাং কোনও ধরণের দৃষ্টিকোণ থেকে, এটি করা আরও সঠিক জিনিস হতে পারে (বিশেষত আপনি যখন এটির সাথে টাইপ করবেন না anyতবে বলুন, _: Event)। এবং যেমনটি আপনি বলেছেন, এটি টাইপ করাতে একটি অক্ষর কম যা কিছু কীবোর্ডে পৌঁছানো আরও সহজ।


6
আমার প্রথম ধারণাটি ছিল _ _ এটি কেবল কনভেনশন দ্বারা স্পষ্ট করে তোলে যে ফাংশনটি বোঝার চেষ্টা করার সময় বিবেচনা করার কোনও যুক্তি নেই। () ব্যবহার এটি সুস্পষ্ট করে তোলে, _ এর সম্ভাব্য ব্যবহারের জন্য কোড স্ক্যান করার প্রয়োজন নেই (যা কনভেনশন লঙ্ঘন করবে)। তবে আপনি ডকুমেন্টিংয়ের মূল্যটি ফাংশনে পাস করার মতো একটি মান রয়েছে যা বিবেচনা করার জন্যও আপনি আমার চোখ খুললেন, যা অন্যথায় সর্বদা সুস্পষ্ট হয় না।
হল্ট

আমি কেবল বুঝতে পেরেছি যে আমার কোডটি অব্যবহৃত _এস এর ফাংশন ভেরিয়েবলগুলিতে পূর্ণ , আমি ভাবছি ব্যবহারের তুলনায় কোনও পারফরম্যান্সের পার্থক্য রয়েছে ()
কিনা

24

আমার ধারণা _ =>কেবলমাত্র ব্যবহৃত হয়েছে () =>কারণ _এটি অন্যান্য ভাষায় প্রচলিত যেখানে এটি কেবল জেএসের মতো পরামিতি বাদ দিতে দেয় না।

_ গোতে জনপ্রিয় এবং এটি প্যারামিটারটিকে অগ্রাহ্য করা হয়েছে এবং সম্ভবত অন্যরা যাদের সম্পর্কে আমি জানি না এটি নির্দেশ করতে এটি ডার্টেও ব্যবহৃত হয়।


4
পাইথনও এই সম্মেলন অনুসরণ করে, আমি মনে করি।
জাইমে আরজিপি

7
এই ব্যবহারটি _সম্ভবত এমএল এবং হাস্কেলের মতো কার্যকরী ভাষা থেকে ধার করা হয়েছিল, যেখানে এটি পাইথনের আবিষ্কারের দীর্ঘকাল পূর্বাভাস দেয় (একা যেতে দাও, ডার্ট বা টাইপস্ক্রিপ্ট)।
রুখ

1
রুবিও তা করে ( po-ru.com/diary/rubys-magic-:30core ) এবং F # খুব (এবং এমএল পরিবার দ্বারা প্রভাবিত অন্যান্য ভাষা)
মারিউজ পাভেলস্কি

স্কালা আন্ডারস্কোর পছন্দ করে ( অন্তর্ভুক্ত ) / স্কালা / ইউজ-ওফাউন্ডসোর- ইন-scala.aspx )। আন্ডারস্কোর সহ বেনামি ধরণের সাথে স্কালা কী করছে তার পরে আর কোন ভাষা গ্রহণ করেছিল।
স্যাম

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

11

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

এই ধরনের পার্থক্য নীচের উদাহরণের মতো দেখতে পারে:

const f1 = () => { } // A function taking no arguments
const f2 = _ => { }  // A function with one argument that doesn't use it

function h(ff) { 
  if (ff.length === 0) {
    console.log("No argument function - calling directly");
    ff();
  } else if (ff.length === 1) {
    console.log("Single argument function - calling with 1");
    ff(1);
  }
}

h(f1);
h(f2);


1
এটি বার্গির উত্তরকে ভিত্তি করে তৈরি করা হয়েছে, তবে আমি ভেবেছিলাম যে এলিস পোস্টে কারও পক্ষে আমি খুশি হওয়ার চেয়ে উদাহরণ যুক্ত করা একটু বেশি সম্পাদনা ছিল।
মাইকেল অ্যান্ডারসন

0

আমি যখন পোস্টটি লিখেছিলাম তখন আমি _ছাড়া তীরের ক্রিয়াগুলি তৈরি করার একমাত্র উপায় ছিল (), যা আমাকে বিশ্বাস করতে পরিচালিত করে _যে কিছু ক্ষুদ্র সুবিধা থাকতে পারে তবে আমি ভুল ছিল but @ হ্যাল্ট মন্তব্যগুলিতে নিশ্চিত করেছেন যে এটি অন্যান্য ভেরিয়েবলগুলির মতো আচরণ করে, এটি কোনও বিশেষ ভাষা নির্মাণ নয়।


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

উদাহরণ:

// simple number doubling function
f = _=> {
    _ = _ * 2;
    return _;
}

console.log(f(2)); // returns 4
console.log(f(10)); // returns 20

Chrome কনসোল, সংস্করণ 76.0.3809.132 (অফিসিয়াল বিল্ড) (-৪-বিট) দিয়ে পরীক্ষিত


1
আন্ডারস্কোর '_' একটি আইনী পরিবর্তনশীল নাম এবং একটি বিশেষ ভাষা নির্মাণ নয়, কেবল সম্মেলনের দ্বারা বিশেষ অর্থ দেওয়া হয়। অব্যক্ত প্যারামিটারগুলি সম্পর্কে লটার সতর্কতাগুলি আন্ডারস্কোর উপসর্গ ব্যবহার করে নিঃশব্দ করা যেতে পারে। আমার ধারণা _ নিজে থেকে অব্যবহৃত বলার সবচেয়ে সংক্ষিপ্ততম উপায়।
হল্ট

@ হ্যাল্ট স্পষ্টতার জন্য ধন্যবাদ, নিশ্চিতভাবে জানা ভাল। আমি সত্যিই বুঝতে পারি নি যে আপনি ()এই পোস্টটি তৈরি করার আগে আপনি তীরের ফাংশনগুলি তৈরি করতে পারবেন , আমি ভেবেছিলাম _এর একমাত্র উপায়, এ কারণেই আমি এটিকে নির্দেশ করার সিদ্ধান্ত নিয়েছি। এটিকে মনে রেখে এটি প্রমাণিত হয় যে গল্ফিংয়ের জন্য এমনকি এটি ব্যবহার করার জন্য বিশেষ কিছু নয়, যেহেতু আপনি কেবল একটি নিয়মিত চরিত্র ব্যবহার করতে পারেন। আপনি যেমন বলেছিলেন ঠিক তেমনি অনুসরণ করার জন্য আরও ভাল ব্যবহার করা উচিত।
ম্যাটসিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.