রুবিতে "ফলন" শব্দের অর্থ কী? এবং এটা ঠিক কি করে?
ভাল…
ফলন হল একটি কীওয়ার্ড (অর্থাৎ এটি ভাষার একটি মূল অংশ) এবং এটি একটি ব্লক কল করার পদ্ধতির ভিতরে ব্যবহার করা হয়।
আপনার যা জানা দরকার তা এখানে রয়েছে :
- একটি ব্লককে কল করা সেই ব্লকের ভিতরে কোড চালায় (যেমন একটি পদ্ধতিতে কল করা)
- ইল্ড ব্লকে যেকোনো সংখ্যক আর্গুমেন্ট পাস করতে পারে
- ব্লকের রিটার্ন মান
yieldএর জন্য রিটার্ন মান হয়ে যায়
এর জন্য আপনাকে ব্লক বুঝতে হবে।
আপনি ব্লকগুলিকে নাম ছাড়াই পদ্ধতি হিসাবে ভাবতে পারেন যা অন্যান্য পদ্ধতিতে অতিরিক্ত আর্গুমেন্ট হিসাবে পাস করা যেতে পারে৷
এখানে একটি উদাহরণ আছে :
def make_salad
yield "lettuce"
yield "carrots"
yield "olive oil"
end
make_salad { |ingredient| puts "Adding #{ingredient} to salad!" }
এটি ব্লকটিকে 3 বার কল করে, এই আউটপুট তৈরি করে :
Adding lettuce to salad! Adding carrots to salad! Adding olive oil to salad!
এটাই মূলত yield করে, একটি পদ্ধতি কল করার মত, কিন্তু পরিবর্তে আপনি ব্লক কল করছেন.
ব্লকটির জন্য আমাদের কাছে কোনো নাম নেই, তাই এই কীওয়ার্ডটি এটির যত্ন নেয়৷
৷এখন :
আপনার কাছে কল করার জন্য ব্লক না থাকলে কী হয় তা অন্বেষণ করা যাক৷
৷ব্লক ছাড়াই ফলন ==ত্রুটি বার্তা
যদি আপনি yield কল করেন একটি ব্লক না করে, তাহলে আপনি একটি ত্রুটি পাবেন৷
উদাহরণ :
def write_code yield end write_code # LocalJumpError: no block given (yield)
এই ত্রুটিটি ক্রিস্টাল-ক্লিয়ার, "কোন ব্লক দেওয়া হয়নি" এর অর্থ হল পদ্ধতি কল write_code একটি ব্লক প্রদান করছে না৷
আপনি কিভাবে এই ত্রুটি প্রতিরোধ করতে পারেন?
এই মত:
def write_code yield if block_given? end
block_given? পদ্ধতিটি একটি ব্লক উপলব্ধ কিনা তা পরীক্ষা করে এবং এটি আপনাকে শুধুমাত্র yield করতে দেয় যদি তা সত্য হয়।
ইল্ড ব্যবহার কেন?
yield ব্যবহার করে ব্লক সক্ষম করে।
আমরা মেথড কলের অংশ হিসেবে কোডের বিট পাস করতে ব্লক ব্যবহার করি।
এটি সহায়ক যখন :
- আপনি একটি জেনেরিক লগিং ফাংশন লিখতে চান, যেটি কোড চালাতে কতক্ষণ লাগে তা লগ করে
- পদ্ধতিটি সম্পন্ন হলে আপনি কিছু কোড চালাতে চান (যেমন জাভাস্ক্রিপ্টে "কলব্যাক")
- আপনি "অলস কোড" চান, এমন কোড যা শুধুমাত্র প্রয়োজনের সময় চলে এবং ব্যবহারকারীর দ্বারা কাস্টমাইজ করা যায় (এর উদাহরণের জন্য,
Hash#fetchসম্পর্কে পড়ুন পদ্ধতি)
চমৎকার!
ইল্ড_সেলফ - পার্থক্য কি?
আপনি এই নতুন yield_self খুঁজে পেতে পারেন পদ্ধতি এবং মনে করুন এটি yield এর সাথে সম্পর্কিত .
আচ্ছা, তা নয়৷৷
এমনকি yield(self) ভিন্ন, কারণ স্ব বলতে বর্তমান বস্তুকে বোঝায়।
যেখানে yield_self , যা রুবি 2.5-এ যোগ করা হয়েছিল, সেই বস্তুটিকে বোঝায় যেটি আমরা পদ্ধতিতে কল করছি।
এই পদ্ধতির জন্য একটি ভাল ব্যবহার?
যখনই আপনি পদ্ধতি চেইন করতে চান এবং আপনি যে বস্তুটিকে yield_self কল করছেন তার সাথে কিছু করতে চাইলে এটি ব্যবহার করুন চালু।
ফলাফল ফেরত দেওয়ার সময়, আসল বস্তুর পরিবর্তে।
উদাহরণ :
n_squared = ->(n) { n ** 2 }
2
.yield_self(&n_squared)
.yield_self(&n_squared)
# 16
রুবি 2.6-এ, yield_self-এর একটি উপনাম আছে , then পদ্ধতি।
তবে এটিকে আপনার নিয়মিত yield এর সাথে বিভ্রান্ত করবেন না .
ঠিক আছে?
রেলে ফলন
আমার yield ব্যবহার করার জন্য একটি দ্রুত উল্লেখ করা উচিত রেল এবং টেমপ্লেটিং ইঞ্জিনে।
আপনি yield খুঁজে পাবেন লেআউটের ভিতরে।
আপনি যে দৃশ্যটি রেন্ডার করছেন তার বিষয়বস্তুর সাথে রেলগুলি এটিকে প্রতিস্থাপন করে৷
কোন yield নেই খালি লেআউটের সমান!
এভাবেই লেআউট এবং আপনার মতামত একত্রিত হয়।
সারাংশ
আপনি রুবিতে ফলন কীওয়ার্ড সম্পর্কে শিখেছেন! এটি ঠিক কী, এটি কীভাবে কাজ করে এবং কেন এটি গুরুত্বপূর্ণ।
এখন আপনার রুবি কোডে একবার চেষ্টা করে দেখুন৷
৷পড়ার জন্য ধন্যবাদ! 🙂