কম্পিউটার টিউটোরিয়াল

রুবির `method` মেথড মাস্টার করুন: অ্যাডভান্সড ডিবাগিং ও ডিপেন্ডেন্সি ম্যানেজমেন্ট

আপনি কি কখনো চেয়েছেন একটি মেথড কে একটি ফাংশনে পাস করতে যেটা শুধু ব্লক নেয়? অথবা বের করতে চেয়েছেন আপনার অবজেক্টের কোন সুপারক্লাস আপনার কল করার চেষ্টা কর रहे মেথডটি ভাঙিয়েছে?

এই জিনিসগুলো method মেথড দিয়ে খুব সহজ। এটা ভালো ব্যবহার করলে, আপনি আপনার ডিপেন্ডেন্সি সম্পর্কে শিখতে পারেন, ঘন্টার পর ঘন্টা ডিবাগিং বাঁচাতে পারেন, এবং আপনার কোডকে সেখানে পৌঁছে দিতে পারেন যেকোনো জায়গায়।

ল্যাম্বডার মত সহজ মেথড

অনেক রুবি মেথড ব্লক বা ল্যাম্বডা নেয়। কিন্তু আপনি সরাসরি একটি মেথড অন্য মেথডে পাস করতে পারবেন না, যেভাবে ল্যাম্বডা দিয়ে করতেন। আপনাকে প্রথমে method ব্যবহার করতে হবে:

irb(main):001:0> sin_method = Math.method(:sin) => #<Method: Math.sin> irb(main):002:0> (1..10).map(&sin_method) => [0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893699]

এখানে কী হচ্ছে?

প্রথম লাইনটি Math.sin মেথডকে একটি Method অবজেক্টে রূপান্তর করে। ল্যাম্বডার মতই, Method অবজেক্ট call-এ রেসপন্ড করে। Method অবজেক্ট to_proc-এ রেসপন্ড করে (ধন্যবাদ, বেনোয়িট)। তাই সেগুলো उन्हीं জায়গাগুলোতে ব্যবহার করা যায় যেগুলোতে আপনি ল্যাম্বডা ব্যবহার করতেন:

irb(main):004:0> sin_method = -> (x) { Math.sin(x) } => #<Proc:0x007fe9f90a9bd8@(irb):4 (lambda)> irb(main):005:0> (1..10).map(&sin_method) => [0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893699]

পहলে লাইনটি আবার দেখুন। এই কোড, ল্যাম্বডা ব্যবহার করে, আগের কোডের মতই কাজ করে, method ব্যবহার করে।

আপনি আপনার কোড কীভাবে লিখেছেন তার ওপর নির্ভর করে, একটি Method অবজেক্ট পাওয়া ল্যাম্বডায় র‍্যাপ করার চেয়ে অনেক সহজ হতে পারে। তাই যখন আপনাকে একটি ল্যাম্বডা দরকার এবং আপনার হাতে শুধু একটি মেথড আছে, method মেথডটি মনে রাখুন।

সেই মেথডটি কোথা থেকে এলো?

আপনি আপনার অবজেক্টের একটি মেথড কল করলেন, এবং সেটা আপনার আশা অনুযায়ী কিছু করল না। হয়তো কেউ সেটাকে ওভাররাইড করলো বা মানকি-প্যাচ করলো। আপনি কীভাবে বুঝবেন?

আপনি পারেন সোর্স কোডে ঘন্টার পর ঘন্টা খনন করতে। কিন্তু Method-এর দুটি মেথড আছে যা কাজটা দ্রুত করতে পারে।

আপনি যে মেথডটি কল করছেন সেটা কোন ক্লাসে ডিফাইন করা হয়েছে সেটা বের করতে owner ব্যবহার করুন:

irb(main):003:0> Task.new.method(:valid?).owner => ActiveRecord::Validations

যখন আপনি একটু গভীরে যেতে চান এবং বের করতে চান কোথায় মেথডটি ডিফাইন করা হয়েছে, source_location ব্যবহার করুন:

irb(main):004:0> Task.new.method(:valid?).source_location => ["/usr/local/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta2/lib/active_record/validations.rb", 55]

source_location একটি অ্যারে রিটার্ন করে। প্রথম এলিমেন্ট হচ্ছে ফাইল পাথ যেখানে মেথডটি ডিফাইন করা হয়েছে, এবং দ্বিতীয় এলিমেন্ট লাইন নম্বর। এগুলো দিয়ে আপনি ঠিক জানতে পারবেন কোথায় দেখতে হবে।

খনন ছাড়া সোর্স পড়া

একবার আপনি বের করতে পারলে কোথায় মেথডটি ডিফাইন করা হয়েছে, আপনি চাইতে পারেন কীভাবে ডিফাইন করা হয়েছে সেটা দেখতে।

Method একা সেটা করতে পারে না। তবে আপনি যদি method_source জেম ইনস্টল করেন, তবে কনসোল থেকে অনেক মেথডের সোর্স কোড দেখতে পারবেন:

irb(main):002:0> puts Task.new.method(:valid?).source def valid?(context = nil) context ||= (new_record? ? :create : :update) output = super(context) errors.empty? && output end => nil

আপনি কমেন্টগুলোও দেখতে পারেন:

irb(main):003:0> puts Task.new.method(:valid?).comment # Runs all the validations within the specified context. Returns +true+ if # no errors are found, +false+ otherwise. # # Aliased as validate. # # If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if # <tt>new_record?</tt> is +true+, and to <tt>:update</tt> if it is not. # # Validations with no <tt>:on</tt> option will run no matter the context. Validations with # some <tt>:on</tt> option will only run in the specified context. => nil

খুব অসাধারণ, ঠিক না? আপনার ডকুমেন্টেশন কনসোলে আছে!

ইনট্রোস্পেকশন অসাধারণ

আমার প্রিয় রুবি ক্লাসগুলোর মধ্যে সেগুলো যেগুলো আপনাকে আপনার কোডকে আপনার কোডের ভিতর থেকে ইনস্পেক্ট করতে দেয়। Class, Module, এবং Method মতো ক্লাস। এগুলো দিয়ে, আপনি আপনার কোড রান হওয়ার সময় তার সম্পর্কে অপ্রত্যাশিতভাবে অনেক কিছু শিখতে পারেন, এবং সেটাকে অন ডি ফ্লাই মডিফাই করতে পারেন। এই ক্লাসগুলো ভালো শিখুন, তাদের API স্টাডি করুন, এবং আপনি রুবির সাথে চমৎকার জিনিসগুলো করতে পারবেন।

  1. রুবির grep মেথড মাস্টারিং: কোড উদাহরণসহ একটি ব্যবহারিক গাইড

  2. রুবির Map মেথড মাস্টারিং: উদাহরণসহ একটি ব্যবহারিক গাইড

  3. রুবিতে Transpose মেথড ব্যবহার করে সহজে রোকে কলামে রূপান্তর করুন

  4. মেটাপ্রোগ্রামিংয়ের আসল খরচ: যা আপনাকে জানা দরকার