কী yield
?
yield
শব্দ একটি উত্পাদক ফাংশন থেকে আয় ডেটা:
একটি জেনারেটরের ফাংশনের হৃদয় হ'ল ফলন কীওয়ার্ড। এর সরল আকারে, একটি ফলন বিবরণীটি অনেকটা রিটার্ন স্টেটমেন্টের মতো দেখায়, ব্যতীত ফাংশনটি কার্যকর করা বন্ধ করে দেওয়া এবং প্রত্যাবর্তনের পরিবর্তে ফলন জেনারেটরের উপরের কোড লুপিংয়ের একটি মান সরবরাহ করে এবং জেনারেটরের ফাংশনটির কার্যকরকরণকে বিরতি দেয়।
জেনারেটরের কাজ কী?
একটি জেনারেটর ফাংশন কার্যকরভাবে একটি Iterator লেখার আরও কমপ্যাক্ট এবং দক্ষ উপায় । এটি আপনাকে এমন একটি ফাংশন (আপনার xrange
) সংজ্ঞায়িত করতে দেয় যা গণনা করে এবং আপনি যখন লুপিংয়ের সময় মানগুলি ফিরিয়ে দেয় :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
এটি নিম্নলিখিত আউটপুট তৈরি করবে:
0 => 1
1 => 2
…
9 => 10
আপনি $key
এটি foreach
ব্যবহার করে নিয়ন্ত্রণও করতে পারেন
yield $someKey => $someValue;
উত্পাদক ফাংশন ইন, $someKey
যাই হোক না কেন আপনার জন্য প্রদর্শিত চাই $key
এবং $someValue
মান হচ্ছে $val
। প্রশ্নের উদাহরণে এটি $i
।
সাধারণ ফাংশনগুলির মধ্যে পার্থক্য কী?
এখন আপনি ভাবতে পারেন যে আমরা কেন এই আউটপুটটি অর্জনের জন্য পিএইচপি এর নেটিভ range
ফাংশনটি ব্যবহার করছি না । এবং ঠিক আপনি আছেন। আউটপুট একই হবে। পার্থক্যটি হল আমরা সেখানে কীভাবে পেলাম।
যখন আমরা ব্যবহার range
পিএইচপি, এটা চালানো হবে, মেমরি সংখ্যার সম্পূর্ণ অ্যারে তৈরি এবং return
যে সমগ্র অ্যারের করতে foreach
লুপ যা পরে এটা এবং আউটপুট মান ওভার যেতে হবে। অন্য কথায়, foreach
অ্যারে নিজেই চালিত হবে। range
ফাংশন এবং foreach
শুধুমাত্র লাগে "Talk" একবার। এটিকে মেইলে প্যাকেজ পাওয়ার মতো ভাবেন। ডেলিভারি লোকটি আপনাকে প্যাকেজ দেয় এবং চলে যাবে। এবং তারপরে আপনি যা আছে তা বাইরে বের করে পুরো প্যাকেজটি মোড়ক করুন।
যখন আমরা জেনারেটর ফাংশনটি ব্যবহার করি, পিএইচপি ফাংশনে প্রবেশ করবে এবং এটি শেষ না হওয়া বা কোনও yield
কীওয়ার্ড না পাওয়া পর্যন্ত এটিকে সম্পাদন করবে । এটি যখন একটিটির সাথে মিলিত হয় yield
, তারপরে এটি সেই সময়ের মানটি যা বাইরের লুপে ফিরে আসবে। তারপরে এটি আবার জেনারেটরের ফাংশনে ফিরে যায় এবং যেখানে ফলন হয়েছিল সেখান থেকে চালিয়ে যায়। যেহেতু আপনার xrange
একটি for
লুপ ধরে আছে তাই এটি কার্যকর হবে এবং $max
পৌঁছানো পর্যন্ত ফলন হবে । এটি foreach
এবং জেনারেটরের পিং পংয়ের মতো চিন্তা করুন।
আমার কেন এটি দরকার?
স্পষ্টতই, জেনারেটরগুলি মেমরি সীমাতে কাজ করতে ব্যবহৃত হতে পারে। আপনার পরিবেশের উপর নির্ভর করে, range(1, 1000000)
উইল করা আপনার স্ক্রিপ্টকে মারাত্মক করবে যেখানে জেনারেটরের সাহায্যে এটি ঠিক কাজ করবে। অথবা উইকিপিডিয়ায় যেমন লেখা আছে:
যেহেতু জেনারেটরগুলি কেবলমাত্র তাদের উত্পাদিত মানগুলি কেবল চাহিদার ভিত্তিতে গণনা করে, তারা ক্রমগুলি উপস্থাপনের জন্য দরকারী যা একবারে গণনা করা ব্যয়বহুল বা অসম্ভব। এর মধ্যে উদাহরণস্বরূপ অসীম অনুক্রম এবং লাইভ ডেটা স্ট্রিম রয়েছে।
জেনারেটরগুলিও বেশ দ্রুত হওয়ার কথা। তবে মনে রাখবেন যে আমরা যখন দ্রুত সম্পর্কে কথা বলি তখন আমরা সাধারণত খুব অল্প সংখ্যায় কথা বলি। সুতরাং এখন আপনি চালাবার আগে এবং জেনারেটরগুলি ব্যবহার করার জন্য আপনার সমস্ত কোড পরিবর্তন করার আগে এটি কোন অর্থবোধ করে তা দেখার জন্য একটি মানদণ্ড করুন।
জেনারেটরের জন্য অন্য ব্যবহারের কেস হ'ল অ্যাসিনক্রোনাস কর্টাইন ines yield
মূলশব্দটি কেবল মানগুলি দেয় না তবে এটি সেগুলি গ্রহণ করে। এ সম্পর্কে তথ্যের জন্য, নীচে লিঙ্কযুক্ত দুটি দুর্দান্ত ব্লগ পোস্ট দেখুন।
আমি কখন থেকে ব্যবহার করতে পারি yield
?
জেনারেটর পিএইচপি 5.5 এ চালু করা হয়েছে । yield
সংস্করণটির আগে ব্যবহারের চেষ্টা করার ফলে কীওয়ার্ডটি অনুসরণ করা কোডের উপর নির্ভর করে বিভিন্ন পার্স ত্রুটি হবে। সুতরাং যদি আপনি এই কোডটি থেকে কোনও পার্স ত্রুটি পান তবে আপনার পিএইচপি আপডেট করুন।
সূত্র এবং আরও পড়া:
yeild
এর মতো একটি সমাধান করুন: আদর্শ one.com/xgqevM