Class: Method (Ruby 2.3.4)

    In Files

    • proc.c

    Class/Module Index [+]

    Quicksearch

    Method

    Public Instance Methods

    meth == other_meth → true or false click to toggle source

    Two method objects are equal if they are bound to the same object and refer to the same method definition and their owners are the same class or module.

     
                   static VALUE
    method_eq(VALUE method, VALUE other)
    {
        struct METHOD *m1, *m2;
        VALUE klass1, klass2;
    
        if (!rb_obj_is_method(other))
            return Qfalse;
        if (CLASS_OF(method) != CLASS_OF(other))
            return Qfalse;
    
        Check_TypedStruct(method, &method_data_type);
        m1 = (struct METHOD *)DATA_PTR(method);
        m2 = (struct METHOD *)DATA_PTR(other);
    
        klass1 = method_entry_defined_class(m1->me);
        klass2 = method_entry_defined_class(m2->me);
    
        if (!rb_method_entry_eq(m1->me, m2->me) ||
            klass1 != klass2 ||
            m1->klass != m2->klass ||
            m1->recv != m2->recv) {
            return Qfalse;
        }
    
        return Qtrue;
    }
                
    prc[params,...] → obj click to toggle source

    Invokes the block, setting the block's parameters to the values in params using something close to method calling semantics. Returns the value of the last expression evaluated in the block.

    a_proc = Proc.new {|scalar, *values| values.map {|value| value*scalar } }
    a_proc.call(9, 1, 2, 3)    #=> [9, 18, 27]
    a_proc[9, 1, 2, 3]         #=> [9, 18, 27]
    a_proc.(9, 1, 2, 3)        #=> [9, 18, 27]
    a_proc.yield(9, 1, 2, 3)   #=> [9, 18, 27]
    

    Note that prc.() invokes prc.call() with the parameters given. It's syntactic sugar to hide "call".

    For procs created using lambda or ->() an error is generated if the wrong number of parameters are passed to the proc. For procs created using Proc.new or Kernel.proc, extra parameters are silently discarded and missing parameters are set to nil.

    a_proc = proc {|a,b| [a,b] }
    a_proc.call(1)   #=> [1, nil]
    
    a_proc = lambda {|a,b| [a,b] }
    a_proc.call(1)   # ArgumentError: wrong number of arguments (given 1, expected 2)
    

    See also Proc#lambda?.

     
                   VALUE
    rb_method_call(int argc, const VALUE *argv, VALUE method)
    {
        VALUE proc = rb_block_given_p() ? rb_block_proc() : Qnil;
        return rb_method_call_with_block(argc, argv, method, proc);
    }
                
    arity → fixnum click to toggle source

    Returns an indication of the number of arguments accepted by a method. Returns a nonnegative integer for methods that take a fixed number of arguments. For Ruby methods that take a variable number of arguments, returns -n-1, where n is the number of required arguments. For methods written in C, returns -1 if the call takes a variable number of arguments.

    class C
      def one;    end
      def two(a); end
      def three(*a);  end
      def four(a, b); end
      def five(a, b, *c);    end
      def six(a, b, *c, &d); end
    end
    c = C.new
    c.method(:one).arity     #=> 0
    c.method(:two).arity     #=> 1
    c.method(:three).arity   #=> -1
    c.method(:four).arity    #=> 2
    c.method(:five).arity    #=> -3
    c.method(:six).arity     #=> -3
    
    "cat".method(:size).arity      #=> 0
    "cat".method(:replace).arity   #=> 1
    "cat".method(:squeeze).arity   #=> -1
    "cat".method(:count).arity     #=> -1
    
     
                   static VALUE
    method_arity_m(VALUE method)
    {
        int n = method_arity(method);
        return INT2FIX(n);
    }
                
    call(params,...) → obj click to toggle source

    Invokes the block, setting the block's parameters to the values in params using something close to method calling semantics. Returns the value of the last expression evaluated in the block.

    a_proc = Proc.new {|scalar, *values| values.map {|value| value*scalar } }
    a_proc.call(9, 1, 2, 3)    #=> [9, 18, 27]
    a_proc[9, 1, 2, 3]         #=> [9, 18, 27]
    a_proc.(9, 1, 2, 3)        #=> [9, 18, 27]
    a_proc.yield(9, 1, 2, 3)   #=> [9, 18, 27]
    

    Note that prc.() invokes prc.call() with the parameters given. It's syntactic sugar to hide "call".

    For procs created using lambda or ->() an error is generated if the wrong number of parameters are passed to the proc. For procs created using Proc.new or Kernel.proc, extra parameters are silently discarded and missing parameters are set to nil.

    a_proc = proc {|a,b| [a,b] }
    a_proc.call(1)   #=> [1, nil]
    
    a_proc = lambda {|a,b| [a,b] }
    a_proc.call(1)   # ArgumentError: wrong number of arguments (given 1, expected 2)
    

    See also Proc#lambda?.

     
                   VALUE
    rb_method_call(int argc, const VALUE *argv, VALUE method)
    {
        VALUE proc = rb_block_given_p() ? rb_block_proc() : Qnil;
        return rb_method_call_with_block(argc, argv, method, proc);
    }
                
    clone → new_method click to toggle source

    Returns a clone of this method.

    class A
      def foo
        return "bar"
      end
    end
    
    m = A.new.method(:foo)
    m.call # => "bar"
    n = m.clone.call # => "bar"
    
     
                   static VALUE
    method_clone(VALUE self)
    {
        VALUE clone;
        struct METHOD *orig, *data;
    
        TypedData_Get_Struct(self, struct METHOD, &method_data_type, orig);
        clone = TypedData_Make_Struct(CLASS_OF(self), struct METHOD, &method_data_type, data);
        CLONESETUP(clone, self);
        RB_OBJ_WRITE(clone, &data->recv, orig->recv);
        RB_OBJ_WRITE(clone, &data->klass, orig->klass);
        RB_OBJ_WRITE(clone, &data->me, rb_method_entry_clone(orig->me));
        return clone;
    }
                
    curry → proc click to toggle source
    curry(arity) → proc

    Returns a curried proc based on the method. When the proc is called with a number of arguments that is lower than the method’s arity, then another curried proc is returned. Only when enough arguments have been supplied to satisfy the method signature, will the method actually be called.

    The optional arity argument should be supplied when currying methods with variable arguments to determine how many arguments are needed before the method is called.

    def foo(a,b,c)
      [a, b, c]
    end
    
    proc  = self.method(:foo).curry
    proc2 = proc.call(1, 2)          #=> #<Proc>
    proc2.call(3)                    #=> [1,2,3]
    
    def vararg(*args)
      args
    end
    
    proc = self.method(:vararg).curry(4)
    proc2 = proc.call(:x)      #=> #<Proc>
    proc3 = proc2.call(:y, :z) #=> #<Proc>
    proc3.call(:a)             #=> [:x, :y, :z, :a]
    
     
                   static VALUE
    rb_method_curry(int argc, const VALUE *argv, VALUE self)
    {
        VALUE proc = method_to_proc(self);
        return proc_curry(argc, argv, proc);
    }
                
    eql?(other_meth) → true or false click to toggle source

    Two method objects are equal if they are bound to the same object and refer to the same method definition and their owners are the same class or module.

     
                   static VALUE
    method_eq(VALUE method, VALUE other)
    {
        struct METHOD *m1, *m2;
        VALUE klass1, klass2;
    
        if (!rb_obj_is_method(other))
            return Qfalse;
        if (CLASS_OF(method) != CLASS_OF(other))
            return Qfalse;
    
        Check_TypedStruct(method, &method_data_type);
        m1 = (struct METHOD *)DATA_PTR(method);
        m2 = (struct METHOD *)DATA_PTR(other);
    
        klass1 = method_entry_defined_class(m1->me);
        klass2 = method_entry_defined_class(m2->me);
    
        if (!rb_method_entry_eq(m1->me, m2->me) ||
            klass1 != klass2 ||
            m1->klass != m2->klass ||
            m1->recv != m2->recv) {
            return Qfalse;
        }
    
        return Qtrue;
    }
                
    hash → integer click to toggle source

    Returns a hash value corresponding to the method object.

    See also Object#hash.

     
                   static VALUE
    method_hash(VALUE method)
    {
        struct METHOD *m;
        st_index_t hash;
    
        TypedData_Get_Struct(method, struct METHOD, &method_data_type, m);
        hash = rb_hash_start((st_index_t)m->recv);
        hash = rb_hash_method_entry(hash, m->me);
        hash = rb_hash_end(hash);
    
        return INT2FIX(hash);
    }
                
    inspect → string click to toggle source

    Returns the name of the underlying method.

    "cat".method(:count).inspect   #=> "#<Method: String#count>"
    
     
                   static VALUE
    method_inspect(VALUE method)
    {
        struct METHOD *data;
        VALUE str;
        const char *s;
        const char *sharp = "#";
        VALUE mklass;
        VALUE defined_class;
    
        TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
        str = rb_str_buf_new2("#<");
        s = rb_obj_classname(method);
        rb_str_buf_cat2(str, s);
        rb_str_buf_cat2(str, ": ");
    
        mklass = data->klass;
    
        if (data->me->def->type == VM_METHOD_TYPE_ALIAS) {
            defined_class = data->me->def->body.alias.original_me->owner;
        }
        else {
            defined_class = method_entry_defined_class(data->me);
        }
    
        if (RB_TYPE_P(defined_class, T_ICLASS)) {
            defined_class = RBASIC_CLASS(defined_class);
        }
    
        if (FL_TEST(mklass, FL_SINGLETON)) {
            VALUE v = rb_ivar_get(mklass, attached);
    
            if (data->recv == Qundef) {
                rb_str_buf_append(str, rb_inspect(mklass));
            }
            else if (data->recv == v) {
                rb_str_buf_append(str, rb_inspect(v));
                sharp = ".";
            }
            else {
                rb_str_buf_append(str, rb_inspect(data->recv));
                rb_str_buf_cat2(str, "(");
                rb_str_buf_append(str, rb_inspect(v));
                rb_str_buf_cat2(str, ")");
                sharp = ".";
            }
        }
        else {
            rb_str_buf_append(str, rb_class_name(mklass));
            if (defined_class != mklass) {
                rb_str_buf_cat2(str, "(");
                rb_str_buf_append(str, rb_class_name(defined_class));
                rb_str_buf_cat2(str, ")");
            }
        }
        rb_str_buf_cat2(str, sharp);
        rb_str_append(str, rb_id2str(data->me->called_id));
        if (data->me->called_id != data->me->def->original_id) {
            rb_str_catf(str, "(%"PRIsVALUE")",
                        rb_id2str(data->me->def->original_id));
        }
        if (data->me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) {
            rb_str_buf_cat2(str, " (not-implemented)");
        }
        rb_str_buf_cat2(str, ">");
    
        return str;
    }
                
    name → symbol click to toggle source

    Returns the name of the method.

     
                   static VALUE
    method_name(VALUE obj)
    {
        struct METHOD *data;
    
        TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
        return ID2SYM(data->me->called_id);
    }
                
    original_name → symbol click to toggle source

    Returns the original name of the method.

     
                   static VALUE
    method_original_name(VALUE obj)
    {
        struct METHOD *data;
    
        TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
        return ID2SYM(data->me->def->original_id);
    }
                
    owner → class_or_module click to toggle source

    Returns the class or module that defines the method.

     
                   static VALUE
    method_owner(VALUE obj)
    {
        struct METHOD *data;
        TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
        return data->me->owner;
    }
                
    parameters → array click to toggle source

    Returns the parameter information of this method.

     
                   static VALUE
    rb_method_parameters(VALUE method)
    {
        const rb_iseq_t *iseq = rb_method_iseq(method);
        if (!iseq) {
            return unnamed_parameters(method_arity(method));
        }
        return rb_iseq_parameters(iseq, 0);
    }
                
    receiver → object click to toggle source

    Returns the bound receiver of the method object.

     
                   static VALUE
    method_receiver(VALUE obj)
    {
        struct METHOD *data;
    
        TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
        return data->recv;
    }
                
    source_location → [String, Fixnum] click to toggle source

    Returns the Ruby source filename and line number containing this method or nil if this method was not defined in Ruby (i.e. native).

     
                   VALUE
    rb_method_location(VALUE method)
    {
        return method_def_location(method_def(method));
    }
                
    super_method → method click to toggle source

    Returns a Method of superclass which would be called when super is used or nil if there is no method on superclass.

     
                   static VALUE
    method_super_method(VALUE method)
    {
        const struct METHOD *data;
        VALUE super_class;
        const rb_method_entry_t *me;
    
        TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
        super_class = RCLASS_SUPER(method_entry_defined_class(data->me));
        if (!super_class) return Qnil;
        me = (rb_method_entry_t *)rb_callable_method_entry_without_refinements(super_class, data->me->called_id);
        if (!me) return Qnil;
        return mnew_internal(me, super_class, data->recv, data->me->called_id, rb_obj_class(method), FALSE, FALSE);
    }
                
    to_proc → proc click to toggle source

    Returns a Proc object corresponding to this method.

     
                   static VALUE
    method_to_proc(VALUE method)
    {
        VALUE procval;
        rb_proc_t *proc;
    
        /*
         * class Method
         *   def to_proc
         *     lambda{|*args|
         *       self.call(*args)
         *     }
         *   end
         * end
         */
        procval = rb_iterate(mlambda, 0, bmcall, method);
        GetProcPtr(procval, proc);
        proc->is_from_method = 1;
        return procval;
    }
                
    to_s → string click to toggle source

    Returns the name of the underlying method.

    "cat".method(:count).inspect   #=> "#<Method: String#count>"
    
     
                   static VALUE
    method_inspect(VALUE method)
    {
        struct METHOD *data;
        VALUE str;
        const char *s;
        const char *sharp = "#";
        VALUE mklass;
        VALUE defined_class;
    
        TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
        str = rb_str_buf_new2("#<");
        s = rb_obj_classname(method);
        rb_str_buf_cat2(str, s);
        rb_str_buf_cat2(str, ": ");
    
        mklass = data->klass;
    
        if (data->me->def->type == VM_METHOD_TYPE_ALIAS) {
            defined_class = data->me->def->body.alias.original_me->owner;
        }
        else {
            defined_class = method_entry_defined_class(data->me);
        }
    
        if (RB_TYPE_P(defined_class, T_ICLASS)) {
            defined_class = RBASIC_CLASS(defined_class);
        }
    
        if (FL_TEST(mklass, FL_SINGLETON)) {
            VALUE v = rb_ivar_get(mklass, attached);
    
            if (data->recv == Qundef) {
                rb_str_buf_append(str, rb_inspect(mklass));
            }
            else if (data->recv == v) {
                rb_str_buf_append(str, rb_inspect(v));
                sharp = ".";
            }
            else {
                rb_str_buf_append(str, rb_inspect(data->recv));
                rb_str_buf_cat2(str, "(");
                rb_str_buf_append(str, rb_inspect(v));
                rb_str_buf_cat2(str, ")");
                sharp = ".";
            }
        }
        else {
            rb_str_buf_append(str, rb_class_name(mklass));
            if (defined_class != mklass) {
                rb_str_buf_cat2(str, "(");
                rb_str_buf_append(str, rb_class_name(defined_class));
                rb_str_buf_cat2(str, ")");
            }
        }
        rb_str_buf_cat2(str, sharp);
        rb_str_append(str, rb_id2str(data->me->called_id));
        if (data->me->called_id != data->me->def->original_id) {
            rb_str_catf(str, "(%"PRIsVALUE")",
                        rb_id2str(data->me->def->original_id));
        }
        if (data->me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) {
            rb_str_buf_cat2(str, " (not-implemented)");
        }
        rb_str_buf_cat2(str, ">");
    
        return str;
    }
                
    unbind → unbound_method click to toggle source

    Dissociates meth from its current receiver. The resulting UnboundMethod can subsequently be bound to a new object of the same class (see UnboundMethod).

     
                   static VALUE
    method_unbind(VALUE obj)
    {
        VALUE method;
        struct METHOD *orig, *data;
    
        TypedData_Get_Struct(obj, struct METHOD, &method_data_type, orig);
        method = TypedData_Make_Struct(rb_cUnboundMethod, struct METHOD,
                                       &method_data_type, data);
        RB_OBJ_WRITE(method, &data->recv, Qundef);
        RB_OBJ_WRITE(method, &data->klass, orig->klass);
        RB_OBJ_WRITE(method, &data->me, rb_method_entry_clone(orig->me));
        OBJ_INFECT(method, obj);
    
        return method;
    }