Given a class, see if instance has method (Ruby)

前端 未结 12 1806

I know in Ruby that I can use respond_to? to check if an object has a certain method.

But, given the class, how can I check if the instance has a certai

相关标签:
12条回答
  • 2020-12-12 12:43

    On my case working with ruby 2.5.3 the following sentences have worked perfectly :

    value = "hello world"
    
    value.methods.include? :upcase
    

    It will return a boolean value true or false.

    0 讨论(0)
  • 2020-12-12 12:44

    If you're checking to see if an object can respond to a series of methods, you could do something like:

    methods = [:valid?, :chase, :test]
    
    def has_methods?(something, methods)
      methods & something.methods == methods
    end
    

    the methods & something.methods will join the two arrays on their common/matching elements. something.methods includes all of the methods you're checking for, it'll equal methods. For example:

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

    so

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

    In this situation, you'd want to use symbols, because when you call .methods, it returns an array of symbols and if you used ["my", "methods"], it'd return false.

    0 讨论(0)
  • 2020-12-12 12:47

    While respond_to? will return true only for public methods, checking for "method definition" on a class may also pertain to private methods.

    On Ruby v2.0+ checking both public and private sets can be achieved with

    Foo.private_instance_methods.include?(:bar) || Foo.instance_methods.include?(:bar)
    
    0 讨论(0)
  • 2020-12-12 12:51

    klass.instance_methods.include :method_name or "method_name", depending on the Ruby version I think.

    0 讨论(0)
  • 2020-12-12 12:54
    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] 
    

    Hope this helps you!

    0 讨论(0)
  • 2020-12-12 12:57

    I don't know why everyone is suggesting you should be using instance_methods and include? when method_defined? does the job.

    class Test
      def hello; end
    end
    
    Test.method_defined? :hello #=> true
    

    NOTE

    In case you are coming to Ruby from another OO language OR you think that method_defined means ONLY methods that you defined explicitly with:

    def my_method
    end
    

    then read this:

    In Ruby, a property (attribute) on your model is basically a method also. So method_defined? will also return true for properties, not just methods.

    For example:

    Given an instance of a class that has a String attribute first_name:

    <instance>.first_name.class #=> String
    
    <instance>.class.method_defined?(:first_name) #=> true
    

    since first_name is both an attribute and a method (and a string of type String).

    0 讨论(0)
提交回复
热议问题