On 10/30/06, Daniel Berger <djberg96 / gmail.com> wrote:
>
> Good question.  I'm not sure why this code fails:
>
> #include <ruby.h>
>
> static VALUE foo_bar(){
>    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_const_get(rb_cObject, rb_intern("Foo"));
>    rb_define_alias(singleton, "baz", "bar");
> }
>
> When I compile and run that it fails with "undefined method `bar' for
> class `Foo'" even though it clearly is defined.  I can see in class.c
> that rb_define_alias is just calling rb_alias from eval.c.  It looks
> like rb_alias handles singletons differently, but why it's not working
> in the example I provided I'm not sure.
>

rb_define_alias only works for instance methods.
rb_define_singleton_method is the same as saying

class Foo
  class << self
    def bar( ) "hello" end
  end
  alias :baz :bar
end

That is going to fail because you have not defined a method "bar" in
the Foo class.  It is defined in the Foo singleton class.

Does that make sense or help at all?  I've got to run to a meeting, so
I don't have time to work out the correct way of doing it.  That's
left as an exercise for the reader ;)

Blessings,
TwP