রুবি বন্ধ: ব্লক, পদ্ধতি এবং ল্যাম্বডাস - পার্থক্য কী?

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

বাধা

ব্লকগুলি do..end বা {.. through এর মাধ্যমে সনাক্ত করা যেতে পারে এবং নীচে দেখানো হিসাবে তর্ক হতে পারে:

রুবির প্রতিটি পদ্ধতিই নিম্নলিখিত উদাহরণের মতো একটি অবৈধ প্যারামিটার হিসাবে alচ্ছিক ব্লক নিতে পারে:

উপরের উদাহরণে, এর অর্থ হ'ল আমরা অভিবাদন পদ্ধতিতে স্যুইচ করছি এবং ব্লকটি শুরু করতে আমাদের ফসলের কীওয়ার্ডটি ব্যবহার করতে হবে। প্যারামিটার নামের সাথে যুক্ত হয়ে আর্গুমেন্ট হিসাবে ব্লকটি উত্পন্ন করতে আমরা একটি স্থানীয় ভেরিয়েবল ("অ্যাশলে" স্ট্রিংকে উল্লেখ করছি যা অভিবাদন পদ্ধতিটিকে একটি আর্গুমেন্ট হিসাবে পাস করেছে) ব্লক তৈরি করতে। ব্লকের ভিতরে, "হ্যালো # {নাম}!" নোট বলেছেন। এখন আসুন দেখুন আমরা যদি ব্লকটিতে আপত্তি না দেখি তবে কী ঘটে।

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

procs

নীচে দেখানো হিসাবে নগদ রেজিস্টারগুলি তৈরি করার দুটি উপায় রয়েছে:

প্রথম উদাহরণে, আমরা প্রোক শ্রেণিতে একটি নতুন পদ্ধতি কল করে এবং যুক্তি হিসাবে এটি ব্লকে পাস করে একটি প্রোক অবজেক্ট তৈরি করি। দ্বিতীয় উদাহরণে আমরা কার্নেল মডিউলটি প্রোক পদ্ধতিতে কল করে আর্গুমেন্ট হিসাবে যেতে পারি।

ব্লকটি সক্রিয় করতে আপনাকে প্রোক অবজেক্টকে কল করতে হবে।

উপরের উদাহরণে, আমরা প্রো 1 তে কল পদ্ধতিটি কল করি যা প্রোক অবজেক্টকে নির্দেশ করে। এরপরে এটি আর্গুমেন্ট হিসাবে কল পদ্ধতিতে পাস করা হয়। মুদ্রিত হয়

নীচের উদাহরণটি দেখায় যে আমরা কোনও সমাবেশে না গেলে কী হয়।

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

Lambdalar

ল্যাম্বডাস তৈরির দুটি উপায় এখানে।

প্রথম উদাহরণে, আমরা লাম্বদা তৈরি করতে এবং ব্লক হিসাবে আর্গুমেন্ট হিসাবে পাস করার জন্য কার্নেল মডিউল থেকে ল্যাম্বদা পদ্ধতিটি কল করি। দ্বিতীয় উদাহরণে, আমরা রুবির সিনট্যাকটিক চিনি ব্যবহার করে একটি ল্যাম্বডা তৈরি করছি। উদাহরণে আমরা ব্যবহার করি -> এবং তারপরে আমরা ব্লক প্যারামিটারটিকে বন্ধনীতে রাখি এবং তারপরে ব্লকে স্থানান্তর করি। সুতরাং ল্যাম্বডা তৈরির দুটি পৃথক পদ্ধতির মধ্যে প্রধান পার্থক্য হ'ল প্রথম উদাহরণে, ব্লকের পরামিতিগুলি ব্লকের অভ্যন্তরে থাকে এবং দ্বিতীয় উদাহরণে, ব্লকের পরামিতিগুলি -> এর পরিবর্তে বন্ধনীগুলিতে থাকে।

একটি বিষয় লক্ষণীয় যে আমরা ল্যাম্বডা তৈরি করতে এটি করতে পারি না:

এটি কারণ ল্যাম্বডাস আসলে ল্যাম্বদা অবজেক্ট নয়, তারা প্রকট বস্তু। প্রিজম এবং ল্যাম্বডাসের মধ্যে প্রধান পার্থক্য হ'ল এরিটিমিয়ার বিভিন্ন বিধি রয়েছে।

যেহেতু ল্যাম্বডাস প্রোকের অবজেক্ট, তাই আমরা ল্যাম্বডায় কলব্যাক পদ্ধতিতে কল করতে পারি এবং ব্লকটি কার্যকর করা হয়। উপরের প্রথম উদাহরণে, আমরা ল্যাম্বদা 1 এ কলব্যাক পদ্ধতিটি কল করি এবং ব্লক প্যারামিটার নামটিতে যাই এবং "হ্যালো # {নাম}!" আসুন অ্যাশলে যুক্তিটি পাওয়া যাক। ফলাফল হ্যালো অ্যাশলে! দ্বিতীয় উদাহরণে, লাম্বডা 1 টি আর্গুমেন্টকে কল না করে কল করা হয় এবং ব্লকটি একটি পরামিতি গ্রহণ করার সাথে সাথে অর্গুমেন্টেরর ফিরে আসে। এটি দেখায় যে পদ্ধতি এবং ব্লকগুলির বিপরীতে ল্যাম্বডাস যুক্তি গণনা করে count

একটি শেষ জিনিস ...

আর একটি জিনিস যা ব্লক, সিলিন্ডার এবং মেষশাবককে আলাদা করে দেয় সেটি হল কীভাবে রিটার্ন কীটি কাজ করে।

বাধা

আমি যখন নিম্নলিখিত কোডটি ব্যবহার করি:

আমি এই ত্রুটি বার্তা পেয়েছি:

অপ্রত্যাশিতভাবে ফিরে আসুন (লোকালজম্পআরার)

সুতরাং, যখন পদ্ধতিটি যা ঘটছে তা অবরুদ্ধ করে, প্রোগ্রামটির সম্পাদন পদ্ধতিটির বাস্তবায়ন থেকে ব্লকে চলে যায়। সাধারণত, যখন প্রোগ্রামের প্রয়োগ হয় তবে আমরা কখনই একটি ব্লক পাই না, প্রোগ্রামগুলি লোকালজ্যাম্পে ফিরে আসে। এই পদ্ধতির বাস্তবায়ন থেকে অস্তিত্বহীন একটি ব্লক পর্যন্ত প্রোগ্রামটির বাস্তবায়নের ফলাফল হয়, সুতরাং একটি ত্রুটি ঘটে। লোকালজম্পআরর ত্রুটিটি পাস করতে কোনও বাধা ছিল না!

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

procs

আমি যখন নিম্নলিখিত কোডটি ব্যবহার করি:

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

Lambdalar

আমি যখন নিম্নলিখিত কোডটি ব্যবহার করি:

কর্মসূচি বাস্তবায়ন তফসিলের আগে থামেনি। যখন ল্যাম্বডা 1 কল করা হয় এবং ব্লকটি কল করা হয়, তখন প্রোগ্রামটির সম্পাদনা প্রক্সি উদাহরণ হিসাবে ব্লক থেকে ফিরে আসে না। পরিবর্তে, প্রোগ্রামটি চালিয়ে যেতে থাকে এবং "বিদায়" lambda_example পদ্ধতি দ্বারা ফিরে আসে। সুতরাং, কোনও ব্লকে রিটার্ন কীওয়ার্ডটি মূল্যায়ন করার সময় ল্যাম্বদা রিটার্ন কীওয়ার্ডটিকে উপেক্ষা করে এবং প্রোগ্রামটি চালিয়ে যায়।

রুবিকে বন্ধ করা কঠিন হতে পারে এবং আপনি যদি আমার ব্লগ বন্ধের কোনও কিছু মিস করেন তবে সেগুলি ভাগ করে নিতে আপনি মুক্ত হতে পারেন!