_ => লাম্বদা অভিব্যক্তিতে এর আন্ডারস্কোরটির অর্থ কী?


111

ল্যাম্বডা মত প্রকাশের _=> exprঅর্থ কী?

_লাম্বদা ইনপুট হিসাবে উদ্দেশ্য কি ?

উদাহরণ:

int count = 0;
list.ForEach(_ => count += 1);

8
হাই এবং স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। দরকারী উত্তর পাওয়ার সম্ভাবনা বাড়ানোর জন্য আমি আপনার প্রশ্নটি সামান্য সম্পাদনার স্বাধীনতা নিয়েছি, আশা করি আপনার আপত্তি নেই।
লাসে ভি কার্লসেন

মনে রাখবেন, অনুমান করা listহয় যে এটি একটি IEnumerable<T>, তারা সবেমাত্র ব্যবহার করতে পারত (এবং হওয়া উচিত)sum = list.Count();
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

আমার ধারণা, এটি রোধ করতে ব্যবহার করা যেতে পারে যে আপনি একটি নতুন পরিবর্তনশীল নাম দিয়ে এই সুযোগটি "দূষিত" করছেন যা অন্য কোথাও ব্যবহৃত হতে পারে যা দ্বন্দ্বের কারণ হতে পারে।
টিম শ্মেলেটার

উত্তর:


84

আপনি যখন প্যারামিটার সম্পর্কে চিন্তা করবেন না তখন এটি একটি কনভেনশন ব্যবহৃত হয়।


3
এটি হাস্কেল এবং অন্যান্য কার্যকরী ভাষাগুলিতে বেশি সাধারণ। আমি মনে করি সেখান থেকেই এসেছে।
গাবে মোথার্ট

10
হাস্কেল, এমএল, স্কেলা এবং অন্যান্যগুলিতে _প্যাটার্ন মিলের ক্ষেত্রে ওয়াইল্ডকার্ড চরিত্র। এর মূল অর্থ "আমি যত্ন করি না, আমি সবসময় এটি মেলে" want এই "আমি যত্ন করি না" তখন যখন আপনি যে বিষয়গুলির যত্ন নেবেন এবং সেখান থেকে নামকরণের কথা আসে তখন এটি অন্যান্য প্রোগ্রামিং ভাষায় ছড়িয়ে পড়ে। উদাহরণস্বরূপ, এটি রুবিতেও উদাহরণ হিসাবে একই অর্থ বোঝাতে ব্যবহৃত হয়, যদিও _রুবির ক্ষেত্রে একেবারে কোনও বিশেষ তাত্পর্য নেই।
জার্গ ডব্লু মিটাগ

@ জার্গডাব্লু মিটাগ মে ২০১০-এ সত্য, তবে জুন ২০১০-তে নয় Aw দুর্দান্ত সময়! :) স্ট্যাকওভারফ্লো.com
অ্যান্ড্রু গ্রিম

38

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

এটি মূলত সি # তে আইনী শনাক্তকারী যা গঠন করে তার জন্য বাক্য গঠনটি ব্যবহার করে এবং যেহেতু কোনও সনাক্তকারী একটি আন্ডারস্কোর দিয়ে শুরু করতে পারে এবং এতে অন্য কিছুই থাকে না, এটি কেবলমাত্র একটি প্যারামিটারের নাম।

আপনি সহজেই লিখতে পারতেন:

var _ = 10;

1
_ এর পরিবর্তে আমরা কি () ব্যবহার করতে পারি?
অমেশ

2
আপনি এটি ব্যবহার করে চেষ্টা করেছেন?
লাসে ভি কার্লসেন

হ্যাঁ, আমি ল্যাম্বদা এক্সপ্রেশন ব্যবহার করে একটি থ্রেড তৈরি করার সময় এটি ব্যবহার করেছি। Thread t= new Thread(()=>doSomething(x,y)); t.start();
অমেশ

আমার ধারনাটি হ'ল, _ এর ব্যবহার সংগ্রহের প্রতিটি পরিবর্তনশীল ল্যাম্বডা এক্সপ্রেশনে ব্যবহার করা হচ্ছে না যদিও এটি ব্যবহৃত হয়নি। কিন্তু যখন আমরা () ব্যবহার করি তখন এটি না ঘটে। মানে প্যারামিটার কম ল্যাম্বডা।
অমেশ

আপনার এটি চেষ্টা করতে হবে ফরইচ পদ্ধতি কলটি ব্যবহার করে। থ্রেড কন্সট্রাক্টরের একটি ওভারলোড রয়েছে যা কোনও প্রতিনিধি নেয় যা কোনও পরামিতি নেয় না। ফোরইচের মতো কোনও পদ্ধতিতে কল করার চেষ্টা করুন, এটির পরিবর্তে পরামিতি নেয় এমন একটি প্রতিনিধি লাগে।
লাসে ভি কার্লসেন


10

কারণ লামডা এক্সপ্রেশনটি বেশিরভাগ ক্ষেত্রে একটি সংক্ষিপ্ত, বেনামে কোডে ব্যবহৃত হয় যাতে কখনও কখনও ভেরিয়েবলের নামটি প্রয়োজনীয় হয় না, এমনকি তারা কোড ব্লকে ভেরিয়েবলটি ব্যবহার না করে, যাতে তারা একটি সংক্ষিপ্ত, কনভেনশনের জন্য একটি _ দেয়


7

আমি _ => _.method()ওয়ান-লাইন, মেথড-কল ল্যাম্বডাসের জন্য দ্বিতীয়টি ব্যবহার করি , কারণ এটি নির্দেশনার জ্ঞানীয় ওজন হ্রাস করে। বিশেষত জেনেরিক্স ব্যবহার করার সময়, লেখার x => x.method()ফলে "" এটি কি এই 'এক্স' এর স্প্লিট-সেকেন্ড বিবেচনা যুক্ত করে? এটি কি স্থানের মধ্যে একটি স্থানাঙ্ক? "

নিম্নলিখিত বিষয় বিবেচনা করুন:

Initialize<Client> ( _=>_.Init() );

জেনেরিক্স কল সহ ব্যবহৃত, এই ক্ষেত্রে আন্ডারস্কোরটি "বাইপাস প্রতীক" হিসাবে কাজ করে। এটি অপ্রয়োজনীয়তা এড়ায়, সংজ্ঞায়িত করে যে আর্গুমেন্টের ধরণ সুস্পষ্ট এবং ব্যবহার থেকে অনুগ্রহ করা যায় - ঠিক তেমনি যখন আপনি কোনও প্রকারের ঘোষণাকে পুনরুক্ত করতে প্রতিরোধ করতে 'ভার' ব্যবহার করেন। লেখা client=>client.Init()এখানে শুধু নির্দেশ আর এটি কোন অর্থ যোগ ছাড়া করতে হবে।

স্পষ্টতই, পদ্ধতিতে পাস করার জন্য এটি পরামিতিগুলির ক্ষেত্রে প্রযোজ্য না, যা বর্ণনামূলকভাবে নামকরণ করা উচিত। যেমন .:Do( id=>Log(id) );

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

মূল কথাটি হ'ল ভারবোসিটি কেবল ছদ্মবেশের জন্য ন্যায়সঙ্গত, বিশেষত ল্যাম্বডাসের জন্য, যা প্রথম স্থানে বেনাম প্রতিনিধিদের সৃষ্টি সহজ করার জন্য তৈরি করা হয়েছিল। যাই হোক না কেন, জ্ঞানবোধ ব্যবহার করা উচিত, সুসংগততা এবং সংক্ষিপ্ততার সামঞ্জস্য রেখে। প্রতীকটি যদি আসল কার্যকারিতাটির জন্য কেবল "হুক" হয় তবে একটি চরিত্র শনাক্তকারী পুরোপুরি ভাল fine ফর-লুপগুলি এবং সূচক হিসাবে "i" এবং "j" অক্ষরের ক্ষেত্রে এটিই।


2
এই পদ্ধতির জন্য +1! আমি যদিও আমি কেবলমাত্র "জ্ঞানীয় ওজন হ্রাস" করতে ল্যাম্বডাসে আন্ডারস্কোর ব্যবহার করছি এবং এই প্যারামিটারটি ব্যবহৃত হচ্ছে না তা দেখানোর জন্য নয়। এটি আন্ডারস্কোরগুলির সাহায্যে সহজভাবে পড়তে পারে, বিশেষত যদি সেখানে শৃঙ্খলা প্রচুর থাকে এবং আপনি অবিলম্বে টাইপটি অনুমান করতে পারেন, যেমন প্রায়শই লিনকিউ প্রশ্নের সাথে দেখা যায়!
ভারভারা কালিনিনা

3
Do(id => Log(id))ভাল হিসাবে সংক্ষিপ্ত বিবরণ হয় Do(Log)
আলুয়ান হাদাদাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.