public Method

Object.singleton_methods(...)

obj.singleton_methods(all=true)     array

Returns an array of the names of singleton methods for obj. If the optional all parameter is true, the list will include methods in modules included in obj.

module Other
  def three() end
end

class Single
  def Single.four() end
end

a = Single.new

def a.one()
end

class << a
  include Other
  def two()
  end
end

Single.singleton_methods    #=> ["four"]
a.singleton_methods(false)  #=> ["two", "one"]
a.singleton_methods         #=> ["two", "one", "three"]

Source Code

/*
*  call-seq:
*     obj.singleton_methods(all=true)    => array
*  
*  Returns an array of the names of singleton methods for <i>obj</i>.
*  If the optional <i>all</i> parameter is true, the list will include
*  methods in modules included in <i>obj</i>.
*     
*     module Other
*       def three() end
*     end
*     
*     class Single
*       def Single.four() end
*     end
*     
*     a = Single.new
*     
*     def a.one()
*     end
*     
*     class << a
*       include Other
*       def two()
*       end
*     end
*     
*     Single.singleton_methods    #=> ["four"]
*     a.singleton_methods(false)  #=> ["two", "one"]
*     a.singleton_methods         #=> ["two", "one", "three"]
*/

VALUE
rb_obj_singleton_methods(argc, argv, obj)
   int argc;
   VALUE *argv;
   VALUE obj;
{
   VALUE recur, ary, klass;
   st_table *list;

   rb_scan_args(argc, argv, "01", &recur);
   if (argc == 0) {
recur = Qtrue;
   }
   klass = CLASS_OF(obj);
   list = st_init_numtable();
   if (klass && FL_TEST(klass, FL_SINGLETON)) {
st_foreach(RCLASS(klass)->m_tbl, method_entry, (st_data_t)list);
klass = RCLASS(klass)->super;
   }
   if (RTEST(recur)) {
while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
    st_foreach(RCLASS(klass)->m_tbl, method_entry, (st_data_t)list);
    klass = RCLASS(klass)->super;
}
   }
   ary = rb_ary_new();
   st_foreach(list, ins_methods_i, ary);
   st_free_table(list);

   return ary;
}
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.