কম্পিউটার

`পদ্ধতি` পদ্ধতির সাথে মজা

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

এই জিনিসগুলি 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 বস্তুগুলি 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 ইনস্টল করেন gem, আপনি সরাসরি আপনার কনসোল থেকে অনেক পদ্ধতির সোর্স কোড দেখতে পারেন:

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. রুবি গ্রেপ পদ্ধতি কীভাবে ব্যবহার করবেন (উদাহরণ সহ)

  2. রুবি মানচিত্র পদ্ধতি কীভাবে ব্যবহার করবেন (উদাহরণ সহ)

  3. রুবি ট্রান্সপোজ পদ্ধতিতে সারিগুলিকে কলামে পরিণত করুন

  4. মেটাপ্রোগ্রামিং এর লুকানো খরচ