রুবি ব্লক, প্রক্স এবং ল্যাম্বডাস।
তারা কি?
তারা কিভাবে কাজ করে?
কিভাবে তারা একে অপরের থেকে আলাদা?
আপনি এই পোস্টটি পড়ে এটি এবং আরও অনেক কিছু শিখবেন!
বিষয়বস্তু
- 1 রুবি ব্লক বোঝা
- 2 রুবি ফলন কীওয়ার্ড
- 3 অন্তর্নিহিত বনাম স্পষ্ট ব্লক
- 4 একটি ব্লক দেওয়া হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন
- 5 ল্যাম্বডা কি?
- 6 Lambdas বনাম Procs
- 7 বন্ধ
- 8 বাইন্ডিং ক্লাস
- 9 ভিডিও টিউটোরিয়াল
- 10 মোড়ানো
- 10.1 সম্পর্কিত
রুবি ব্লক বোঝা
রুবি ব্লক হল সামান্য বেনামী ফাংশন যা পদ্ধতিতে পাস করা যেতে পারে।
ব্লকগুলি একটি do / end
এ আবদ্ধ বিবৃতি বা বন্ধনীর মধ্যে {}
, এবং তাদের একাধিক আর্গুমেন্ট থাকতে পারে।
আর্গুমেন্টের নাম দুটি পাইপের মধ্যে সংজ্ঞায়িত করা হয় |
অক্ষর।
আপনি যদি each
ব্যবহার করে থাকেন আগে, তারপর আপনি ব্লক ব্যবহার করেছেন!
এখানে একটি উদাহরণ :
# ফর্ম 1:একক লাইন ব্লকের জন্য সুপারিশ করা হয়[1, 2, 3]. প্রতিটি { |সংখ্যা| num রাখে } ^^^^^ ^^^^^^^^ ব্লক ব্লক আর্গুমেন্ট বডি
# ফর্ম 2:মাল্টি-লাইন ব্লকের জন্য সুপারিশ করা হয়েছে[1, 2, 3]. প্রতিটি ড | numend রাখে
একটি রুবি ব্লক দরকারী কারণ এটি আপনাকে কিছুটা যুক্তি (কোড) সংরক্ষণ করতে এবং পরে এটি ব্যবহার করতে দেয়৷
এটি একটি ফাইলে ডেটা লেখার মতো কিছু হতে পারে, একটি উপাদান অন্যটির সমান কিনা তা তুলনা করা বা এমনকি একটি ত্রুটি বার্তা প্রিন্ট করা।
রুবি ফলন কীওয়ার্ড
কি yield
রুবি মানে?
ফলন হল একটি রুবি কীওয়ার্ড যখন আপনি এটি ব্যবহার করেন তখন এটি একটি ব্লক বলে।
এটা কিভাবে পদ্ধতি ব্লক ব্যবহার করে!
আপনি যখন yield
ব্যবহার করেন কীওয়ার্ড, ব্লকের ভিতরের কোডটি চলবে এবং এর কাজ করুন।
ঠিক যেমন আপনি যখন নিয়মিত রুবি পদ্ধতিতে কল করেন।
এখানে একটি উদাহরণ আছে :
def print_once yieldendprint_once { রাখে "Block is being run" }
এটি print_once
-এ পাস করা যেকোনো ব্লক চালায় , ফলস্বরূপ, "Block is being run"
স্ক্রিনে প্রিন্ট করা হবে।
আপনি কি জানেন…
সেই yield
একাধিকবার ব্যবহার করা যাবে?
প্রতিবার আপনি yield
কল করুন , ব্লকটি চলবে, তাই এটি আবার একই পদ্ধতিতে কল করার মত।
উদাহরণ :
def print_twice yield yieldendprint_wice { puts "Hello" }# "Hello"# "Hello"
এবং ঠিক পদ্ধতির মতো…
আপনি yield
-এ যেকোনো সংখ্যক আর্গুমেন্ট পাস করতে পারেন .
উদাহরণ :
def one_two_three yield 1 ield 2 ield 3endone_two_three { |number| সংখ্যা রাখে * 10 }# 10, 20, 30
এই যুক্তিগুলি তখন ব্লকের আর্গুমেন্টে পরিণত হয়৷
৷
এই উদাহরণে number
.
অন্তর্ভুক্ত বনাম স্পষ্ট ব্লক
ব্লকগুলি "স্পষ্ট" বা "অন্তর্নিহিত" হতে পারে।
স্পষ্ট মানে আপনি এটিকে আপনার প্যারামিটার তালিকায় একটি নাম দিয়েছেন৷
৷আপনি অন্য পদ্ধতিতে একটি সুস্পষ্ট ব্লক পাস করতে পারেন বা পরে ব্যবহার করার জন্য এটি একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন৷
এখানে একটি উদাহরণ :
def explicit_block(&block) block.call # yieldendexplicit_block এর মতই { রাখে "স্পষ্ট ব্লক বলা হয়" }
&block
লক্ষ্য করুন প্যারামিটার…
এভাবেই আপনি ব্লকের নাম নির্ধারণ করেন!
একটি ব্লক দেওয়া হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন
যদি আপনি yield
করার চেষ্টা করেন একটি ব্লক ছাড়া আপনি একটি no block given (yield)
পাবেন ত্রুটি৷
আপনি block_given?
দিয়ে একটি ব্লক পাস করা হয়েছে কিনা তা পরীক্ষা করতে পারেন পদ্ধতি।
উদাহরণ :
def do_something_with_block রিটার্ন "কোন ব্লক দেওয়া হয়নি" যদি না ব্লক_গিভেন? ফলন
কেউ ব্লক ছাড়াই আপনার পদ্ধতিতে কল করলে এটি ত্রুটি প্রতিরোধ করে।
ল্যাম্বডা কি?
ল্যাম্বডা হল কিছু বিশেষ সিনট্যাক্স সহ একটি ব্লক এবং এর প্যারামিটারগুলিকে সংজ্ঞায়িত করার একটি উপায়৷
আপনি এই ল্যাম্বডাকে পরবর্তীতে ব্যবহারের জন্য একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন।
রুবি ল্যাম্বডা সংজ্ঞায়িত করার জন্য সিনট্যাক্স এই মত দেখায়:
say_something =-> { রাখে "এটি একটি ল্যাম্বডা" }
আপনি বিকল্প সিনট্যাক্সও ব্যবহার করতে পারেন:
lambda
->
এর পরিবর্তে .
একটি ল্যাম্বডা সংজ্ঞায়িত করা এটির ভিতরে কোড চালাবে না, যেমন একটি পদ্ধতি সংজ্ঞায়িত করা পদ্ধতিটি চালাবে না, আপনাকে call
ব্যবহার করতে হবে এর জন্য পদ্ধতি।
উদাহরণ :
say_something =-> { রাখে "এটি একটি ল্যাম্বডা" }say_something.call# "এটি একটি ল্যাম্বডা"
call
করার অন্যান্য উপায় আছে একটি lambda
, তারা বিদ্যমান আছে জেনে ভালো, যাইহোক, আমি call
এর সাথে লেগে থাকার পরামর্শ দিচ্ছি স্পষ্টতার জন্য।
এখানে তালিকা আছে :
my_lambda =-> { "ল্যাম্বদা বলা হয়" }my_lambda.callmy_lambda.()my_lambda[]my_lambda.===
Lambdas এছাড়াও যুক্তি নিতে পারে, এখানে একটি উদাহরণ:
times_two =->(x) { x * 2 }times_two.call(10)# 20
যদি আপনি একটি lambda
এ ভুল সংখ্যক আর্গুমেন্ট পাস করেন , এটি একটি ব্যতিক্রম উত্থাপন করবে, ঠিক একটি নিয়মিত পদ্ধতির মতো৷
Lambdas বনাম Procs
Procs একটি খুব অনুরূপ ধারণা…
পার্থক্যগুলির মধ্যে একটি হল আপনি কীভাবে এগুলি তৈরি করেন৷
৷উদাহরণ :
my_proc =Proc.new { |x| x }রাখে
কোন ডেডিকেটেড Lambda
নেই ক্লাস একটি lambda
শুধুমাত্র একটি বিশেষ Proc
বস্তু আপনি যদি Proc
থেকে উদাহরণ পদ্ধতিগুলি দেখেন , আপনি লক্ষ্য করবেন সেখানে একটি lambda?
আছে পদ্ধতি।
এখন :
একটি proc একটি ল্যাম্বডা থেকে ভিন্নভাবে আচরণ করে, বিশেষ করে যখন এটি আর্গুমেন্টের ক্ষেত্রে আসে:
t =Proc.new { |x,y| রাখে "আমি তর্কের বিষয়ে চিন্তা করি না!" }t.call# "আমি আর্গুমেন্টের বিষয়ে চিন্তা করি না!"
procs
এর মধ্যে আরেকটি পার্থক্য &lambdas
তারা কিভাবে একটি return
প্রতিক্রিয়া দেখায় বিবৃতি।
একটি lambda
return
সাধারণত, একটি নিয়মিত পদ্ধতির মত।
কিন্তু একটি proc
return
চেষ্টা করবে বর্তমান প্রেক্ষাপট থেকে।
আমি যা বলতে চাচ্ছি তা এখানে :
আপনি যদি নিম্নলিখিত কোডটি চালান, তাহলে আপনি লক্ষ্য করবেন কিভাবে proc
একটি LocalJumpError
উত্থাপন করে ব্যতিক্রম।
কারণ হল আপনি return
করতে পারবেন না শীর্ষ-স্তরের প্রসঙ্গ থেকে।
এটি চেষ্টা করুন :
# উচিত workmy_lambda =-> { return 1 }puts "Lambda result:#{my_lambda.call}"# উত্থাপন করা উচিত exceptionmy_proc =Proc.new { return 1 }puts "Proc ফলাফল:#{my_proc.call}"প্রে>যদি
proc
একটি পদ্ধতির মধ্যে ছিল, তারপর কল করাreturn
সেই পদ্ধতি থেকে ফিরে আসার সমতুল্য।এটি নিম্নলিখিত উদাহরণে প্রদর্শিত হয়৷
৷def call_proc রাখে "proc এর আগে" my_proc =Proc.new { return 2 } my_proc.call রাখে "After proc"endp call_proc# প্রিন্ট করে "proc এর আগে" কিন্তু "proc এর পরে" নয়এখানে কিভাবে
procs
তার একটি সারসংক্ষেপ এবংlambdas
আলাদা:
- ল্যাম্বডাসকে
-> {}
দিয়ে সংজ্ঞায়িত করা হয়েছে এবংProc.new {}
সহ procs . - প্রোক্স বর্তমান পদ্ধতি থেকে ফিরে আসে, যখন ল্যাম্বডাস ল্যাম্বডা থেকে ফিরে আসে।
- প্রোকস আর্গুমেন্টের সঠিক সংখ্যার বিষয়ে চিন্তা করে না, যখন ল্যাম্বডাস একটি ব্যতিক্রম উত্থাপন করবে।
এই তালিকাটি একবার দেখে, আমরা দেখতে পাব যে lambdas
procs
থেকে একটি নিয়মিত পদ্ধতির অনেক কাছাকাছি হয়।
বন্ধ
রুবি প্রকস এবং ল্যাম্বডাসের আরেকটি বিশেষ গুণ রয়েছে। আপনি যখন একটি রুবি প্রোক তৈরি করেন, তখন এটি এটির সাথে বর্তমান এক্সিকিউশন স্কোপ ক্যাপচার করে।
এই ধারণা, যাকে কখনও কখনও বন্ধ বলা হয়, মানে হল একটি proc
যেখানে এটি সংজ্ঞায়িত করা হয়েছিল সেই প্রেক্ষাপট থেকে স্থানীয় ভেরিয়েবল এবং পদ্ধতির মতো মানগুলি বহন করবে৷
তারা প্রকৃত মান বহন করে না, তবে তাদের একটি রেফারেন্স, তাই যদি proc তৈরি হওয়ার পরে ভেরিয়েবলগুলি পরিবর্তিত হয়, তাহলে proc সর্বদা সর্বশেষ সংস্করণ থাকবে৷
একটি উদাহরণ দেখা যাক :
def call_proc(my_proc) গণনা =500 my_proc.callendcount =1my_proc =Proc.new { পুট গণনা }p call_proc(my_proc) # এই প্রিন্ট কি?
এই উদাহরণে আমাদের একটি স্থানীয় count
আছে পরিবর্তনশীল, যা 1
এ সেট করা আছে .
আমাদের my_proc
নামে একটি proc আছে , এবং একটি call_proc
পদ্ধতি যা চলে (call
এর মাধ্যমে পদ্ধতি) যেকোন প্রোক বা ল্যাম্বডা যা একটি যুক্তি হিসাবে পাস করা হয়।
আপনি কি মনে করেন এই প্রোগ্রামটি প্রিন্ট করবে?
এটা মনে হবে 500
সবচেয়ে যৌক্তিক উপসংহার, কিন্তু 'বন্ধ' প্রভাবের কারণে এটি 1
প্রিন্ট করবে .
এটি ঘটে কারণ proc count
এর মান ব্যবহার করছে যে জায়গা থেকে proc সংজ্ঞায়িত করা হয়েছিল, এবং এটি পদ্ধতির সংজ্ঞার বাইরে।
বাইন্ডিং ক্লাস
রুবি প্রোকস এবং ল্যাম্বডাস এই সুযোগের তথ্য কোথায় সঞ্চয় করে?
আমি আপনাকে Binding
সম্পর্কে বলি ক্লাস…
আপনি যখন একটি Binding
তৈরি করেন Binding
এর মাধ্যমে বস্তু পদ্ধতি, আপনি কোডের এই বিন্দুতে একটি 'অ্যাঙ্কর' তৈরি করছেন।
এই মুহুর্তে সংজ্ঞায়িত প্রতিটি পরিবর্তনশীল, পদ্ধতি এবং শ্রেণী পরে এই বস্তুর মাধ্যমে উপলব্ধ হবে, এমনকি আপনি সম্পূর্ণ ভিন্ন সুযোগে থাকলেও৷
উদাহরণ :
def return_binding foo =100 bindingend# Foo বাইন্ডিংয়ের জন্য উপলব্ধ, # যদিও আমরা পদ্ধতির বাইরে আছি# যেখানে এটি সংজ্ঞায়িত করা হয়েছিল। সরাসরি foo প্রিন্ট করলে আপনি একটি ত্রুটি পাবেন।# কারণ হল foo পদ্ধতির বাইরে কখনই সংজ্ঞায়িত করা হয়নি। foo
অন্য কথায়, Binding
এর প্রেক্ষাপটে কিছু কার্যকর করা বস্তুটি একই রকম যেন সেই কোডটি একই জায়গায় ছিল যেখানে সেই Binding
সংজ্ঞায়িত করা হয়েছিল ('অ্যাঙ্কর' রূপকটি মনে রাখবেন)।
আপনাকে Binding
ব্যবহার করতে হবে না বস্তুগুলি সরাসরি, কিন্তু এটি এখনও একটি জিনিস জেনে রাখা ভাল 🙂
ভিডিও টিউটোরিয়াল
র্যাপিং আপ
এই পোস্টে আপনি শিখেছেন কিভাবে ব্লকগুলি কাজ করে, রুবি প্রোকস এবং ল্যাম্বডাসের মধ্যে পার্থক্য এবং আপনি "ক্লোজার" প্রভাব সম্পর্কেও শিখেছেন যা আপনি যখনই একটি ব্লক তৈরি করেন।
একটা জিনিস আমি কভার করিনি তা হল তরকারি পদ্ধতি।
এই পদ্ধতিটি আপনাকে কিছু বা সমস্ত প্রয়োজনীয় আর্গুমেন্টে পাস করতে দেয়।
আপনি যদি শুধুমাত্র আংশিক সংখ্যক আর্গুমেন্টে পাস করেন তবে আপনি এই আর্গুমেন্টগুলি ইতিমধ্যেই 'প্রি-লোডেড' সহ একটি নতুন প্রোক পাবেন, যখন সমস্ত আর্গুমেন্ট সরবরাহ করা হবে তখন প্রসিকটি কার্যকর করা হবে৷
আমি আশা করি আপনি এই পোস্টটি উপভোগ করেছেন!
নীচের ফর্মটিতে সদস্যতা নিতে ভুলবেন না এবং এটি আপনার বন্ধুদের সাথে শেয়ার করুন৷ 🙂