হ্যাঁ, এটি প্রথমে কিছুটা বিস্মিত।
রুবিতে, পদ্ধতিগুলি কোডের স্বেচ্ছাসেবী বিভাগগুলি সম্পাদন করার জন্য একটি কোড ব্লক পেতে পারে।
যখন কোনও পদ্ধতি কোনও ব্লক প্রত্যাশা করে, তখন এটি yield
ফাংশনটি কল করে এটি শুরু করে।
উদাহরণস্বরূপ, তালিকার উপরে পুনরাবৃত্তি করা বা কাস্টম অ্যালগরিদম সরবরাহ করা এটি খুব সহজ।
নিম্নলিখিত উদাহরণটি ধরুন:
আমি Person
একটি নামের সাথে প্রাথমিকভাবে একটি ক্লাস সংজ্ঞায়িত করতে যাচ্ছি , এবং একটি do_with_name
পদ্ধতি সরবরাহ করব যা যখন আহ্বান করা হয়, তখন কেবল name
প্রাপ্ত বৈশিষ্ট্যের সাথে, অ্যাট্রিবিউটটি পাস করে ।
class Person
def initialize( name )
@name = name
end
def do_with_name
yield( @name )
end
end
এটি আমাদের সেই পদ্ধতিটি কল করতে এবং একটি স্বেচ্ছাসেবীর কোড ব্লক পাস করার অনুমতি দেয়।
উদাহরণস্বরূপ, নামটি মুদ্রণের জন্য আমরা যা করব:
person = Person.new("Oscar")
#invoking the method passing a block
person.do_with_name do |name|
puts "Hey, his name is #{name}"
end
মুদ্রণ করবে:
Hey, his name is Oscar
লক্ষ্য করুন, ব্লকটি একটি প্যারামিটার হিসাবে, একটি ভেরিয়েবল নামে পরিচিত name
(এনবি আপনি এই ভেরিয়েবলটিকে আপনার পছন্দ মতো কোনও কিছু বলতে পারেন, তবে এটি কল করার পক্ষে তা বোঝা যায় name
)। কোডটি যখন প্রার্থনা yield
করে তখন এই পরামিতিটির মান পূরণ করে @name
।
yield( @name )
ভিন্ন ক্রিয়া সম্পাদনের জন্য আমরা অন্য একটি ব্লক সরবরাহ করতে পারি। উদাহরণস্বরূপ, নামটি বিপরীত করুন:
#variable to hold the name reversed
reversed_name = ""
#invoke the method passing a different block
person.do_with_name do |name|
reversed_name = name.reverse
end
puts reversed_name
=> "racsO"
আমরা ঠিক একই পদ্ধতি ( do_with_name
) ব্যবহার করেছি - এটি কেবল একটি আলাদা ব্লক।
এই উদাহরণটি তুচ্ছ। আরও আকর্ষণীয় ব্যবহারগুলি হ'ল একটি অ্যারেতে সমস্ত উপাদান ফিল্টার করা:
days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
# select those which start with 't'
days.select do | item |
item.match /^t/
end
=> ["tuesday", "thursday"]
অথবা, আমরা স্ট্রিং আকারের উপর ভিত্তি করে একটি কাস্টম বাছাই অ্যালগরিদমও সরবরাহ করতে পারি:
days.sort do |x,y|
x.size <=> y.size
end
=> ["monday", "friday", "tuesday", "thursday", "wednesday"]
আমি আশা করি এটি আপনাকে আরও ভাল করে বুঝতে সহায়তা করে।
বিটিডাব্লু, যদি ব্লকটি alচ্ছিক হয় তবে আপনার এটির মতো কল করা উচিত:
yield(value) if block_given?
Alচ্ছিক না হলে কেবল এটির জন্য আবেদন করুন।
সম্পাদনা
@hmak এই উদাহরণগুলির জন্য একটি repl.it তৈরি করেছে: https://repl.it/@makstaks/blocksandyieldsrubyexample