ruby - একটি বর্গ দেওয়া, দৃষ্টান্ত আছে পদ্ধতি দেখুন(রুবি)



respond-to (8)

আমি Ruby জানি যে আমি respond_to? ব্যবহার করতে পারেন respond_to? একটি বস্তুর একটি নির্দিষ্ট পদ্ধতি আছে কিনা তা পরীক্ষা করার জন্য।

কিন্তু, ক্লাসটি দেওয়া হলে, উদাহরণটি কীভাবে নির্দিষ্ট পদ্ধতিতে আছে তা আমি কীভাবে পরীক্ষা করতে পারি?

যেমন, কিছু ভালো

Foo.new.respond_to?(:bar)

কিন্তু নতুন অনুভূতি ত্বরান্বিত করার চেয়ে আরও ভাল উপায় হতে পারে বলে আমি মনে করি।


Answer #1

" একটি শ্রেণী দেওয়া, উত্তর উদাহরণ আছে (রুবি) " উত্তর ভাল। দৃশ্যত রুবি এই অন্তর্নির্মিত আছে, এবং আমি একেবারে এটা মিস। আমার উত্তর রেফারেন্স জন্য বামে হয়, নির্বিশেষে।

রুবি ক্লাসগুলি public_instance_methods এবং public_instance_methods পদ্ধতিগুলির প্রতিক্রিয়া public_instance_methods । রুবি 1.8 তে, প্রথম উদাহরণগুলি সমস্ত ইনস্ট্যান্স পদ্ধতির স্ট্রিংগুলির একটি অ্যারের মধ্যে নাম এবং দ্বিতীয়টি জনসাধারণের পদ্ধতিগুলিতে এটির উপর বিধিনিষেধ দেয়। দ্বিতীয় আচরণটি কি আপনি চান যা সম্ভবত, respond_to? থেকে respond_to? ডিফল্ট হিসাবে নিজেকে পাশাপাশি পাবলিক পদ্ধতিতে সীমাবদ্ধ।

Foo.public_instance_methods.include?('bar')

রুবি 1.9, যদিও, ঐ পদ্ধতি প্রতীক অ্যারে ফিরে।

Foo.public_instance_methods.include?(:bar)

আপনি যদি প্রায়ই এটি করার পরিকল্পনা করেন তবে আপনি শর্টকাট পদ্ধতি অন্তর্ভুক্ত করতে Module প্রসারিত করতে পারেন। (এটি Class পরিবর্তে মডিউলটিতে এটি বরাদ্দ করা অসম্ভব মনে হতে পারে, কিন্তু যেহেতু instance_methods পদ্ধতিগুলি লাইভ, এটি সেই প্যাটার্নের সাথে সঙ্গতিপূর্ণ থাকা সর্বোত্তম।)

class Module
  def instance_respond_to?(method_name)
    public_instance_methods.include?(method_name)
  end
end

যদি আপনি রুবি 1.8 এবং রুবি 1.9 উভয়কে সমর্থন করতে চান তবে উভয় স্ট্রিং এবং প্রতীকগুলির জন্য অনুসন্ধান যুক্ত করার জন্য এটি যুক্ত করার জন্য একটি সুবিধাজনক জায়গা হবে।


Answer #2

Ruby সঙ্গে কাজ আমার ক্ষেত্রে 2.5.3 নিম্নলিখিত বাক্য পুরোপুরি কাজ করেছেন:

value = "hello world"

value.methods.include? :upcase

এটি একটি বুলিয়ান মান সত্য বা মিথ্যা ফিরে আসবে।


Answer #3

আমি method_defined? সঙ্গে কিছু ভুল আছে মনে হয় method_defined? Rails মধ্যে। এটি অসঙ্গতিপূর্ণ বা কিছু হতে পারে, তাই আপনি যদি Rails ব্যবহার করেন, তবে attribute_method?(attribute) থেকে কিছু ব্যবহার করা ভাল attribute_method?(attribute)

" method_defined জন্য পরীক্ষা? ActiveRecord ক্লাসে একটি তাত্ক্ষণিকতা পর্যন্ত কাজ করে না " অসঙ্গতি সম্পর্কে একটি প্রশ্ন।


Answer #4

আমি জানি না সবাই কেন পরামর্শ দিচ্ছেন আপনি instance_methods ব্যবহার করছেন এবং include? যখন method_defined? কাজ করে।

class Test
  def hello; end
end

Test.method_defined? :hello #=> true

Answer #5

এটি সর্বোত্তম উপায় কিনা নিশ্চিত নয়, তবে আপনি সর্বদা এটি করতে পারেন:

Foo.instance_methods.include? 'bar'

Answer #6

যদি আপনি কোনও অবজেক্টগুলি কোনও সিরিজের প্রতিক্রিয়াগুলিতে প্রতিক্রিয়া জানাতে পারেন কিনা তা যাচাই করতে চান তবে আপনি এমন কিছু করতে পারেন:

methods = [:valid?, :chase, :test]

def has_methods?(something, methods)
  methods & something.methods == methods
end

methods & something.methods তাদের সাধারণ / মিলিং উপাদানের দুটি অ্যারে যোগদান করবে। something.methods আপনি যে সমস্ত পদ্ধতিগুলির জন্য অনুসন্ধান করছেন তা অন্তর্ভুক্ত করে, এটি সমান পদ্ধতির সাথে যুক্ত হবে। উদাহরণ স্বরূপ:

[1,2] & [1,2,3,4,5]
==> [1,2]

সুতরাং

[1,2] & [1,2,3,4,5] == [1,2]
==> true

এই অবস্থায়, আপনি প্রতীকগুলি ব্যবহার করতে চান, কারণ যখন আপনি কল করবেন। পদ্ধতিগুলি, এটি প্রতীকগুলির একটি অ্যারে প্রদান করে এবং যদি আপনি ["my", "methods"] এটি মিথ্যা ফিরে আসবে।


Answer #7

klass.instance_methods.include :method_name বা "method_name" , আমি মনে করি রুবি সংস্করণের উপর নির্ভর করে।


Answer #8
class Foo
 def self.fclass_method
 end
 def finstance_method
 end
end

foo_obj = Foo.new
foo_obj.class.methods(false)
=> [:fclass_method] 

foo_obj.class.instance_methods(false)
=> [:fclass_method] 

এই আপনি সাহায্য করে আশা করি!





respond-to