একটি শ্রেণীর উদাহরণ পদ্ধতিগুলির তালিকা পান


98

আমার একটি ক্লাস রয়েছে:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

আমি কিভাবে (এই ক্লাসে আমার পদ্ধতি একটি তালিকা পেতে পারেন method1, method2,method3 )?

উত্তর:


116

আপনি প্রকৃতপক্ষে চান TestClass.instance_methods, যদি না আপনি TestClassনিজে যা করতে পারেন তাতে আগ্রহী ।

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

TestClass.methods.grep(/method1/) # => []
TestClass.instance_methods.grep(/method1/) # => ["method1"]
TestClass.methods.grep(/new/) # => ["new"]

অথবা আপনি অবজেক্টটিতে কল করতে পারেন methods(না instance_methods):

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]

4
হেই, আপনি আমাকে 47 সেকেন্ডের মধ্যে মারলেন। +1
ফ্রেগজ

4
আমি যখন চেষ্টা করি তখন আমি print TestClass.new.instance_methodsএই ত্রুটিটি my_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
পেয়েছি

আপনার কেবল করা দরকার TestClass.new.methods। সম্ভবত "এটি" আমার উত্তরে দ্বিধাগ্রস্ত ছিল।
অ্যান্ড্রু গ্রিম

নোট করুন যে রুবি ১.৯++ এর অধীনে পদ্ধতির নামের অ্যারেগুলি চিহ্নগুলি রয়েছে, স্ট্রিং নয়।
ফ্রেগজ

4
@ ফ্রোগজ: হ্যাঁ, তবে এগুলিতে আপনাকে নিয়মিত অভিব্যক্তি ব্যবহার করার অনুমতি দেওয়া হয়েছে। তুমি চতুহলুকেও তলব করো না! :) যদিও আপনি [:method1]পরিবর্তে পেতে হবে।
অ্যান্ড্রু গ্রিম

114
TestClass.methods(false) 

কেবলমাত্র সেই শ্রেণীর অন্তর্গত এমন পদ্ধতিগুলি পেতে।

TestClass.instance_methods(false) আপনার প্রদত্ত উদাহরণ থেকে পদ্ধতিগুলি ফিরিয়ে আনবে (যেহেতু তারা টেস্টক্লাসের উদাহরণ পদ্ধতি)।


4
এটি পরীক্ষা করার দুর্দান্ত উপায় যদি কোনও ক্লাসের সিউডো-ইন্টারফেস / অ্যাবস্ট্রাক্ট বেস ক্লাস থেকে পলিমারফিডের পদ্ধতি থাকে তবে পদ্ধতিগুলি সরাসরি চেষ্টা না করে কল করতে হবে।
ড্যানিয়েল ডোজেমা

4
গৃহীত উত্তরটি দুর্দান্ত তবে সম্ভবত এটি আরও বেশি লোকেরা এখানে আসবে!
অ্যারন

এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত। ধন্যবাদ!
ভিনিস ব্রাসিল

@ অ্যারন: আমি অত্যন্ত সন্দেহ করি যেহেতু এই উত্তরটি ভুলObject#methodsপদ্ধতি ফেরৎ যে আপনি পারেন কল একটি অন বস্তুর । কোন বস্তুতে আপনি কল করতে পারেন এমন কী কী পদ্ধতি রয়েছে? যেগুলি তার শ্রেণিতে সংজ্ঞায়িত হয় । যার অর্থ হল আপনি যে TestClass.methodsপদ্ধতিগুলির উপর কল করতে পারেন তার তালিকা ফিরিয়ে দেয় TestClass, এটি এমন পদ্ধতি যা এর ক্লাসে সংজ্ঞায়িত হয়। কি TestClass'র বর্গ? এটা হয় Class। সুতরাং, TestClass.methodsআপনাকে সেই পদ্ধতিগুলি দেয় যা সংজ্ঞায়িত হয় Class, সংজ্ঞায়িত হয় না TestClass। নিশ্চিত নয় যে এই উত্তরটি কীভাবে 116 টি আপত্তি পেয়েছে, যখন কেউ সম-সহ
Jörg W Mittag

… সবচেয়ে দূরবর্তী উত্তীর্ণ জ্ঞান তাত্ক্ষণিকভাবে এটি ভুল হিসাবে স্বীকৃত হবে। অথবা, আপনি জানেন, এই কোডটি কেবল অনুলিপি করুন এবং আটকানো এবং এটি চালানো প্রকাশ করে দেবে যে এটি ভুল।
Jörg ডব্লু মিট্টাগ

39
TestClass.instance_methods

বা উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত পদ্ধতি ছাড়াই

TestClass.instance_methods - Object.methods

('টেস্টক্লাস.মোথডস - অবজেক্ট.মোথডস')


25
বা ছাড়া উত্তরাধিকারসূত্রে পদ্ধতি: TestClass.methods(false)
সাভা

4
@ সোয়া TestClass.methods(false)খালি ফিরে আসে
ভ্লাদিমির সুসানভ

4
এই উত্তরটি ভুল; ফলাফল অন্তর্ভুক্ত করা হবে না method1, method2অথবা method3সেই হিসেবে পদ্ধতি দৃষ্টান্ত ক্লাসের, পদ্ধতি না TestClassবস্তুর নিজেই।
ফ্রেগজ

4
@ ফড়্গজ: ওহো ... হ্যাঁ, 'টেস্টক্লাস.ইনট্যান্স_মোথডস - অবজেক্ট.মোথডস', বা 'টেস্টক্লাস.নেউ.মোথডস - অবজেক্ট.মোথডস' ... যা কনসোল চালিয়ে না দেওয়ার জন্য আমাকে শিখিয়ে দেবে। এই উত্তরটি মুছে ফেলা বা সম্পাদনা করা কি আমার পক্ষে সেরা?
প্যাভলিং

4
@ পাভলিং আপনার উত্তরটি সঠিক হওয়ার জন্য অবশ্যই সম্পাদনা করুন। (দ্রুত, ওপি অন্য কাউকে ক্রেডিট দেওয়ার আগে! :)
ফ্রেগজ



2

রুবি ডক উদাহরণ অনুসারে_মোথডস

রিসিভারে সর্বজনীন এবং সুরক্ষিত উদাহরণ পদ্ধতিগুলির নাম সম্বলিত একটি অ্যারে প্রদান করে। মডিউলটির জন্য, এগুলি সর্বজনীন এবং সুরক্ষিত পদ্ধতি; একটি শ্রেণীর জন্য, তারা উদাহরণ (সিঙ্গলটন নয়) পদ্ধতি। Alচ্ছিক প্যারামিটারটি মিথ্যা হলে কোনও পূর্বপুরুষের পদ্ধতিগুলি অন্তর্ভুক্ত নয়। আমি অফিসিয়াল ডকুমেন্টেশন উদাহরণ নিচ্ছি।

module A
  def method1()  
    puts "method1 say hi"
  end
end
class B
  include A #mixin
  def method2()  
     puts "method2 say hi"
  end
end
class C < B #inheritance
  def method3() 
     puts "method3 say hi"
  end
end

আউটপুট দেখুন।

A.instance_methods(false)
  => [:method1]

A.instance_methods
  => [:method1]
B.instance_methods
 => [:method2, :method1, :nil?, :===, ...# ] # methods inherited from parent class, most important :method1 is also visible because we mix module A in class B

B.instance_methods(false)
  => [:method2]
C.instance_methods
  => [:method3, :method2, :method1, :nil?, :===, ...#] # same as above
C.instance_methods(false)
 => [:method3]

1

শুধুমাত্র নিজস্ব পদ্ধতিগুলি পেতে এবং উত্তরাধিকারসূত্রে বাদ দেওয়া:

উদাহরণের মধ্যে থেকে:

self.methods - self.class.superclass.instance_methods

বাইরে থেকে:

TestClass.instance_methods - TestClass.superclass.instance_methods

এটি ক্লাসে যুক্ত করুন:

class TestClass
  class << self
    def own_methods
      self.instance_methods - self.superclass.instance_methods
    end
  end
end

TestClass.own_methods
=> [:method1, :method2, :method3]

(রুবি ২.6.x সহ)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.