কখন ফাংশন প্যারামিটার *args, **kwargs ব্যবহার করব!


(Tanvir Hasan (Anick)) #1

প্রথমত রুবিতে ফাংশন প্যারামিটারে সব কিছুই রেফারেন্স হিসেবে যায়। তাই ফাংশন এর ভিতর থেকে যদি প্যারামিটারের ভ্যালু চেঞ্জ করা হয় তাহলে মেইন অবজেক্ট এর ও ভ্যালু চেঞ্জ হয়ে যাবে।

options = {key1: 'value1', key2: 'value2'}
def change(kwargs={})
  kwargs[:key1]  = 'new value'
end

এখানে ruby change(options) কল করা হলে, মেইন options এর ভ্যালু চেঞ্জ হয়ে যাবে। এখন যদি দরকার হয় যে এই kwargs call by value এর মত কাজ করবে ( যদিও ruby তে call by value বলে কিছু নাই ) তাহলে প্যারামিটার **kwargs দিয়ে সেট করতে হবে।

options = {key1: 'value1', key2: 'value2'}
def change(**kwargs)
  kwargs[:key1]  = 'new value'
end

এখানে ruby change(options) কল করলেও মেইন options এর ভ্যালু চেঞ্জ হবে না।
এখন কথা হল এইটা কিভাবে কাজ করে, খুবই সিম্পল **kwargs ফাংশন কলিং এর সময় ওই অবজেক্টের একটা নতুন অবজেক্ট তৈরী করে নেয়।
ঠিক এমনভাবে *args এ্যারে এর জন্য।
*args, **kwargs এর আরও কিছু মজার ব্যবহার আছে। যেমন কোন ফাংশনে যদি লেখা হয় এইভাবে

  def show(value, *array, **hash)
    # do something
  end

এই ফাংশন যদি কল করা হয় এইভাবে show(1,2,3,4, key1: ‘test’, key2: ‘test2’) তাহলে ভ্যালু সেট হবে এইভাবেঃ
value = 1
array = [2,3,4]
hash = {key1: 'test1, key2: ‘test2’ }


(Sayem Hossain) #2

Interesting. I’m gonna share in facebook.


(Sayem Hossain) #3

এই ভ্যালু অ্যাসাইনমেন্টের ব্যাপারটা খুবই কনফিউজিং। ডেভেলপারদের অত্যাদিক স্বাধীনতা দিতে গিয়ে রুবি তার কোডের সিনট্যাক্স কমপ্লেক্স করে ফেলেছে। আপাতদৃষ্টিতে ব্যাপারটা এক্সাইটিং মনে হলেও পরবর্তীতে মেইনটেইন করতে খবর হয়ে যাবে।
রুবির মাঙ্কি প্যাচ জিনিসটাও ঠিক এরকম। করার সময় মাজাই লাগবে কিন্তু ডিবাগ করার সময় বোঝা যাবে কত আরামে কত নির্ঘুম রাত।