Two method objects are equal if that are bound to the same object and contain the same body.
static VALUE method_eq(VALUE method, VALUE other) { struct METHOD *m1, *m2; if (TYPE(other) != T_DATA || RDATA(other)->dmark != (RUBY_DATA_FUNC) bm_mark) return Qfalse; if (CLASS_OF(method) != CLASS_OF(other)) return Qfalse; Data_Get_Struct(method, struct METHOD, m1); Data_Get_Struct(other, struct METHOD, m2); if (m1->oclass != m2->oclass || m1->rclass != m2->rclass || m1->recv != m2->recv || m1->body != m2->body) return Qfalse; return Qtrue; }
Invokes the meth with the specified arguments, returning the method's return value.
m = 12.method("+") m.call(3) #=> 15 m.call(20) #=> 32
VALUE rb_method_call(int argc, VALUE *argv, VALUE method) { VALUE result = Qnil; /* OK */ struct METHOD *data; int state; volatile int safe = -1; Data_Get_Struct(method, struct METHOD, data); if (data->recv == Qundef) { rb_raise(rb_eTypeError, "can't call unbound method; bind first"); } PUSH_TAG(); if (OBJ_TAINTED(method)) { safe = rb_safe_level(); if (rb_safe_level() < 4) { rb_set_safe_level_force(4); } } if ((state = EXEC_TAG()) == 0) { rb_thread_t *th = GET_THREAD(); VALUE rb_vm_call(rb_thread_t * th, VALUE klass, VALUE recv, VALUE id, ID oid, int argc, const VALUE *argv, const NODE *body, int nosuper); PASS_PASSED_BLOCK_TH(th); result = rb_vm_call(th, data->oclass, data->recv, data->id, data->oid, argc, argv, data->body, 0); } POP_TAG(); if (safe >= 0) rb_set_safe_level_force(safe); if (state) JUMP_TAG(state); return result; }
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); }
Invokes the meth with the specified arguments, returning the method's return value.
m = 12.method("+") m.call(3) #=> 15 m.call(20) #=> 32
VALUE rb_method_call(int argc, VALUE *argv, VALUE method) { VALUE result = Qnil; /* OK */ struct METHOD *data; int state; volatile int safe = -1; Data_Get_Struct(method, struct METHOD, data); if (data->recv == Qundef) { rb_raise(rb_eTypeError, "can't call unbound method; bind first"); } PUSH_TAG(); if (OBJ_TAINTED(method)) { safe = rb_safe_level(); if (rb_safe_level() < 4) { rb_set_safe_level_force(4); } } if ((state = EXEC_TAG()) == 0) { rb_thread_t *th = GET_THREAD(); VALUE rb_vm_call(rb_thread_t * th, VALUE klass, VALUE recv, VALUE id, ID oid, int argc, const VALUE *argv, const NODE *body, int nosuper); PASS_PASSED_BLOCK_TH(th); result = rb_vm_call(th, data->oclass, data->recv, data->id, data->oid, argc, argv, data->body, 0); } POP_TAG(); if (safe >= 0) rb_set_safe_level_force(safe); if (state) JUMP_TAG(state); return result; }
MISSING: documentation
static VALUE method_clone(VALUE self) { VALUE clone; struct METHOD *orig, *data; Data_Get_Struct(self, struct METHOD, orig); clone = Data_Make_Struct(CLASS_OF(self), struct METHOD, bm_mark, -1, data); CLONESETUP(clone, self); *data = *orig; return clone; }
Two method objects are equal if that are bound to the same object and contain the same body.
static VALUE method_eq(VALUE method, VALUE other) { struct METHOD *m1, *m2; if (TYPE(other) != T_DATA || RDATA(other)->dmark != (RUBY_DATA_FUNC) bm_mark) return Qfalse; if (CLASS_OF(method) != CLASS_OF(other)) return Qfalse; Data_Get_Struct(method, struct METHOD, m1); Data_Get_Struct(other, struct METHOD, m2); if (m1->oclass != m2->oclass || m1->rclass != m2->rclass || m1->recv != m2->recv || m1->body != m2->body) return Qfalse; return Qtrue; }
Return a hash value corresponding to the method object.
static VALUE method_hash(VALUE method) { struct METHOD *m; long hash; Data_Get_Struct(method, struct METHOD, m); hash = (long)m->oclass; hash ^= (long)m->rclass; hash ^= (long)m->recv; hash ^= (long)m->body; return INT2FIX(hash); }
Show 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 = "#"; Data_Get_Struct(method, struct METHOD, data); str = rb_str_buf_new2("#<"); s = rb_obj_classname(method); rb_str_buf_cat2(str, s); rb_str_buf_cat2(str, ": "); if (FL_TEST(data->oclass, FL_SINGLETON)) { VALUE v = rb_iv_get(data->oclass, "__attached__"); if (data->recv == Qundef) { rb_str_buf_append(str, rb_inspect(data->oclass)); } 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_cat2(str, rb_class2name(data->rclass)); if (data->rclass != data->oclass) { rb_str_buf_cat2(str, "("); rb_str_buf_cat2(str, rb_class2name(data->oclass)); rb_str_buf_cat2(str, ")"); } } rb_str_buf_cat2(str, sharp); rb_str_append(str, rb_id2str(data->oid)); rb_str_buf_cat2(str, ">"); return str; }
Returns the name of the method.
static VALUE method_name(VALUE obj) { struct METHOD *data; Data_Get_Struct(obj, struct METHOD, data); return ID2SYM(data->id); }
Returns the class or module that defines the method.
static VALUE method_owner(VALUE obj) { struct METHOD *data; Data_Get_Struct(obj, struct METHOD, data); return data->oclass; }
Returns the bound receiver of the method object.
static VALUE method_receiver(VALUE obj) { struct METHOD *data; Data_Get_Struct(obj, struct METHOD, data); return data->recv; }
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 iseq_location(get_method_iseq(method)); }
Returns a Proc
object corresponding to this method.
static VALUE method_proc(VALUE method) { VALUE procval; rb_proc_t *proc; /* * class Method * def to_proc * proc{|*args| * self.call(*args) * } * end * end */ procval = rb_iterate(mlambda, 0, bmcall, method); GetProcPtr(procval, proc); proc->is_from_method = 1; return procval; }
Show 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 = "#"; Data_Get_Struct(method, struct METHOD, data); str = rb_str_buf_new2("#<"); s = rb_obj_classname(method); rb_str_buf_cat2(str, s); rb_str_buf_cat2(str, ": "); if (FL_TEST(data->oclass, FL_SINGLETON)) { VALUE v = rb_iv_get(data->oclass, "__attached__"); if (data->recv == Qundef) { rb_str_buf_append(str, rb_inspect(data->oclass)); } 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_cat2(str, rb_class2name(data->rclass)); if (data->rclass != data->oclass) { rb_str_buf_cat2(str, "("); rb_str_buf_cat2(str, rb_class2name(data->oclass)); rb_str_buf_cat2(str, ")"); } } rb_str_buf_cat2(str, sharp); rb_str_append(str, rb_id2str(data->oid)); rb_str_buf_cat2(str, ">"); return str; }
Dissociates meth from it's 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; Data_Get_Struct(obj, struct METHOD, orig); method = Data_Make_Struct(rb_cUnboundMethod, struct METHOD, bm_mark, -1, data); data->oclass = orig->oclass; data->recv = Qundef; data->id = orig->id; data->body = orig->body; data->rclass = orig->rclass; data->oid = orig->oid; OBJ_INFECT(method, obj); return method; }