On 10/30/06, Daniel Berger <djberg96 / gmail.com> wrote:
> Tim Pease wrote:
> > On 10/30/06, Daniel Berger <djberg96 / gmail.com> wrote:
> > >
> > > void Init_foo(){
> > >    VALUE cFoo, singleton;
> > >
> > >    cFoo = rb_define_class("Foo", rb_cObject);
> > >
> > >    rb_define_singleton_method(cFoo, "bar", foo_bar, 0);
> > >
> > >    singleton = rb_const_get(rb_cObject, rb_intern("Foo"));
> > >    rb_define_alias(singleton, "baz", "bar");
> > > }
> > >

Your line of code above that grabs the singleton class is incorrect.

singleton = rb_const_get( rb_cObject, rb_intern("Foo"));

This will just return the class object for your "Foo" class. In this
case singleton is equivalent to cFoo. Try this out in your code ...

singleton == cFoo

That should equate to true.  Here is the correct way to grab the
singleton class from C code ...

> cat foo.c
#include <ruby.h>

static VALUE
foo_bar( VALUE self ) {
  return rb_str_new2( "hello" );
}


void
Init_foo( ) {
  VALUE cFoo, singleton;

  cFoo = rb_define_class("Foo", rb_cObject);

  rb_define_singleton_method(cFoo, "bar", foo_bar, 0);

  singleton = rb_singleton_class(cFoo);
  rb_define_alias(singleton, "baz", "bar");
}

Now you can do this ...

Foo.bar         #=> "hello"
Foo.baz         #=> "hello"


The magic syntax is the line ...

singleton = rb_singleton_class(cFoo);

That gives me Foo's singleton.

Blessings,
TwP