Class: Method
Instance Method Summary collapse
-
#==(other_meth) ⇒ Boolean
Two method objects are equal if they are bound to the same object and refer to the same method definition.
-
#[] ⇒ Object
Invokes the meth with the specified arguments, returning the method's return value.
-
#arity ⇒ Fixnum
Returns an indication of the number of arguments accepted by a method.
-
#call ⇒ Object
Invokes the meth with the specified arguments, returning the method's return value.
-
#clone ⇒ Object
MISSING: documentation.
-
#==(other_meth) ⇒ Boolean
Two method objects are equal if they are bound to the same object and refer to the same method definition.
-
#hash ⇒ Integer
Returns a hash value corresponding to the method object.
-
#inspect ⇒ Object
Returns the name of the underlying method.
-
#name ⇒ Object
Returns the name of the method.
-
#owner ⇒ Object
Returns the class or module that defines the method.
-
#parameters ⇒ Array
Returns the parameter information of this method.
-
#receiver ⇒ Object
Returns the bound receiver of the method object.
-
#source_location ⇒ Array, Fixnum
Returns the Ruby source filename and line number containing this method or nil if this method was not defined in Ruby (i.e. native).
-
#to_proc ⇒ Proc
Returns a
Proc
object corresponding to this method. -
#to_s ⇒ Object
Returns the name of the underlying method.
-
#unbind ⇒ Object
Dissociates meth from its current receiver.
Instance Method Details
#==(other_meth) ⇒ Boolean
Two method objects are equal if they are bound to the same object and refer to the same method definition.
|
# File 'proc.c'
static VALUE
method_eq(VALUE method, VALUE other)
{
struct METHOD *m1, *m2;
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);
if (!rb_method_entry_eq(m1->me, m2->me) ||
m1->rclass != m2->rclass ||
m1->recv != m2->recv) {
return Qfalse;
}
|
#call(args, ...) ⇒ Object #[](args, ...) ⇒ Object
Invokes the meth with the specified arguments, returning the method's return value.
m = 12.method("+")
m.call(3) #=> 15
m.call(20) #=> 32
|
# File 'proc.c'
VALUE
rb_method_call(int argc, VALUE *argv, VALUE method)
{
VALUE result = Qnil; /* OK */
struct METHOD *data;
int state;
volatile int safe = -1;
TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
if (data->recv == Qundef) {
rb_raise(rb_eTypeError, "can't call unbound method; bind first");
}
|
#arity ⇒ Fixnum
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
|
# File 'proc.c'
static VALUE
method_arity_m(VALUE method)
{
int n = method_arity(method);
return INT2FIX(n);
}
|
#call(args, ...) ⇒ Object #[](args, ...) ⇒ Object
Invokes the meth with the specified arguments, returning the method's return value.
m = 12.method("+")
m.call(3) #=> 15
m.call(20) #=> 32
|
# File 'proc.c'
VALUE
rb_method_call(int argc, VALUE *argv, VALUE method)
{
VALUE result = Qnil; /* OK */
struct METHOD *data;
int state;
volatile int safe = -1;
TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
if (data->recv == Qundef) {
rb_raise(rb_eTypeError, "can't call unbound method; bind first");
}
|
#clone ⇒ Object
MISSING: documentation
|
# File 'proc.c'
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);
*data = *orig;
data->me = ALLOC(rb_method_entry_t);
*data->me = *orig->me;
if (data->me->def) data->me->def->alias_count++;
data->ume = ALLOC(struct unlinked_method_entry_list_entry);
return clone;
}
|
#==(other_meth) ⇒ Boolean
Two method objects are equal if they are bound to the same object and refer to the same method definition.
|
# File 'proc.c'
static VALUE
method_eq(VALUE method, VALUE other)
{
struct METHOD *m1, *m2;
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);
if (!rb_method_entry_eq(m1->me, m2->me) ||
m1->rclass != m2->rclass ||
m1->recv != m2->recv) {
return Qfalse;
}
|
#hash ⇒ Integer
Returns a hash value corresponding to the method object.
|
# File 'proc.c'
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->rclass);
hash = rb_hash_uint(hash, (st_index_t)m->recv);
hash = rb_hash_uint(hash, (st_index_t)m->me->def);
hash = rb_hash_end(hash);
return INT2FIX(hash);
}
|
#to_s ⇒ String #inspect ⇒ String
Returns the name of the underlying method.
"cat".method(:count).inspect #=> "#<Method: String#count>"
|
# File 'proc.c'
static VALUE
method_inspect(VALUE method)
{
struct METHOD *data;
VALUE str;
const char *s;
const char *sharp = "#";
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, ": ");
if (FL_TEST(data->me->klass, FL_SINGLETON)) {
VALUE v = rb_iv_get(data->me->klass, "__attached__");
if (data->recv == Qundef) {
rb_str_buf_append(str, rb_inspect(data->me->klass));
}
|
#name ⇒ Object
Returns the name of the method.
|
# File 'proc.c'
static VALUE
method_name(VALUE obj)
{
struct METHOD *data;
TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
return ID2SYM(data->id);
}
|
#owner ⇒ Object
Returns the class or module that defines the method.
|
# File 'proc.c'
static VALUE
method_owner(VALUE obj)
{
struct METHOD *data;
TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
return data->me->klass;
}
|
#parameters ⇒ Array
Returns the parameter information of this method.
|
# File 'proc.c'
static VALUE
rb_method_parameters(VALUE method)
{
rb_iseq_t *iseq = rb_method_get_iseq(method);
if (!iseq) {
return unnamed_parameters(method_arity(method));
}
|
#receiver ⇒ Object
Returns the bound receiver of the method object.
|
# File 'proc.c'
static VALUE
method_receiver(VALUE obj)
{
struct METHOD *data;
TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
return data->recv;
}
|
#source_location ⇒ Array, Fixnum
Returns the Ruby source filename and line number containing this method or nil if this method was not defined in Ruby (i.e. native)
|
# File 'proc.c'
VALUE
rb_method_location(VALUE method)
{
rb_method_definition_t *def = method_get_def(method);
if (def->type == VM_METHOD_TYPE_ATTRSET || def->type == VM_METHOD_TYPE_IVAR) {
if (!def->body.attr.location)
return Qnil;
return rb_ary_dup(def->body.attr.location);
}
|
#to_proc ⇒ Proc
Returns a Proc
object corresponding to this method.
|
# File 'proc.c'
static VALUE
method_proc(VALUE method)
{
VALUE procval;
rb_proc_t *proc;
/*
* class Method
* def to_proc
* proc{|*args|
* self.call(*args)
* }
|
#to_s ⇒ String #inspect ⇒ String
Returns the name of the underlying method.
"cat".method(:count).inspect #=> "#<Method: String#count>"
|
# File 'proc.c'
static VALUE
method_inspect(VALUE method)
{
struct METHOD *data;
VALUE str;
const char *s;
const char *sharp = "#";
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, ": ");
if (FL_TEST(data->me->klass, FL_SINGLETON)) {
VALUE v = rb_iv_get(data->me->klass, "__attached__");
if (data->recv == Qundef) {
rb_str_buf_append(str, rb_inspect(data->me->klass));
}
|
#unbind ⇒ Object
Dissociates meth from its current receiver. The resulting UnboundMethod
can subsequently be bound to a new object of the same class (see UnboundMethod
).
|
# File 'proc.c'
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);
data->recv = Qundef;
data->id = orig->id;
data->me = ALLOC(rb_method_entry_t);
*data->me = *orig->me;
if (orig->me->def) orig->me->def->alias_count++;
data->rclass = orig->rclass;
data->ume = ALLOC(struct unlinked_method_entry_list_entry);
OBJ_INFECT(method, obj);
return method;
}
|