এরিক লিপার্ট পুনরাবৃত্তকারী ব্লকগুলিতে সীমাবদ্ধতা (এবং সেই পছন্দগুলি প্রভাবিত করে নকশার সিদ্ধান্তগুলি) সম্পর্কে নিবন্ধগুলির একটি দুর্দান্ত সিরিজ লিখেছেন
নির্দিষ্ট পুনরাবৃত্তকারী ব্লকগুলি কিছু পরিশীলিত সংকলক কোড রূপান্তর দ্বারা প্রয়োগ করা হয়। এই রূপান্তরগুলি বেনাম ফাংশন বা ল্যাম্বডাসের ভিতরে ঘটে এমন রূপান্তরগুলির সাথে প্রভাব ফেলবে যে নির্দিষ্ট পরিস্থিতিতে তারা উভয়ই কোডটিকে অন্য কোনও কনস্ট্রাক্টে 'রূপান্তর' করার চেষ্টা করবে যা অপরের সাথে সামঞ্জস্যপূর্ণ নয়।
ফলস্বরূপ তারা মিথস্ক্রিয়া থেকে নিষিদ্ধ।
হুডের নীচে পুনরাবৃত্তকারীদের কীভাবে ব্লক কাজ করে তা এখানে ভালভাবে মোকাবেলা করা হয় ।
অসম্পূর্ণতার সহজ উদাহরণ হিসাবে:
public IList<T> GreaterThan<T>(T t)
{
IList<T> list = GetList<T>();
var items = () => {
foreach (var item in list)
if (fun.Invoke(item))
yield return item;
}
return items.ToList();
}
সংকলক একই সাথে এটিকে এমন কিছুতে রূপান্তর করতে চাইছে:
private class Magic
{
private T t;
private IList<T> list;
private Magic(List<T> list, T t) { this.list = list; this.t = t;}
public IEnumerable<T> DoIt()
{
var items = () => {
foreach (var item in list)
if (fun.Invoke(item))
yield return item;
}
}
}
public IList<T> GreaterThan<T>(T t)
{
var magic = new Magic(GetList<T>(), t)
var items = magic.DoIt();
return items.ToList();
}
এবং একই সময়ে পুনরাবৃত্তকারী দিকটি চেষ্টা করার চেষ্টা করছে এটি একটি সামান্য রাষ্ট্র মেশিন তৈরির কাজ work কিছু সাধারণ উদাহরণ ন্যায্য পরিমাণে বিচক্ষণতা যাচাইয়ের সাথে কাজ করতে পারে (প্রথমে (সম্ভবত নির্বিচারে) নেস্টেড ক্লোজারগুলির সাথে ডিলিং করে) তারপরে দেখছে যে খুব নীচের স্তরের ফলস্বরূপ শ্রেণিগুলি পুনরায় রাষ্ট্রের মেশিনে রূপান্তরিত হতে পারে কিনা।
তবে এটি হবে
- বেশ কাজ।
- দক্ষতার জন্য নির্দিষ্ট রূপান্তর প্রয়োগের ফলে ক্লোজার দিকটি প্রতিরোধ করতে সক্ষম হওয়া খুব কম সময়েই ইটারেটর ব্লক দিকটি ছাড়াই সমস্ত ক্ষেত্রে কাজ করা সম্ভব হয়নি (যেমন সম্পূর্ণরূপে ক্লোজার ক্লাসের পরিবর্তে স্থানীয় ভেরিয়েবলগুলিকে উদাহরণস্বরূপ ভেরিয়েবলগুলিতে উন্নীত করা)।
- যদি ওভারল্যাপের সামান্য সম্ভাবনাও ছিল যেখানে এটি অসম্ভব বা কার্যকরভাবে প্রয়োগ করা যথেষ্ট ছিল না তবে অনেক ব্যবহারকারীদের মধ্যে সূক্ষ্ম ব্রেকিং পরিবর্তনটি হারাতে পারার কারণে সহায়তা সংক্রান্ত সমস্যার সংখ্যা বেশি হতে পারে।
- এটি খুব সহজেই চারপাশে কাজ করা যেতে পারে।
আপনার উদাহরণে যেমন:
public IList<T> Find<T>(Expression<Func<T, bool>> expression)
where T : class, new()
{
return FindInner(expression).ToList();
}
private IEnumerable<T> FindInner<T>(Expression<Func<T, bool>> expression)
where T : class, new()
{
IList<T> list = GetList<T>();
var fun = expression.Compile();
foreach (var item in list)
if (fun.Invoke(item))
yield return item;
}
async
ল্যাম্বডাস প্রবেশ করতেawait
পারি, তখনও তারা কেনyield
ভিতরে বেনামে পুনরাবৃত্তি না করে তা জানতে আগ্রহী হব । কম বেশি, এটি একই স্টেট মেশিন জেনারেটর।