From: Ross Bamford Date: 2006-10-31T03:09:35+09:00 Subject: Re: Alias singleton method from C On Tue, 2006-10-31 at 02:10 +0900, Daniel Berger wrote: > Tim Pease wrote: > > On 10/30/06, Daniel Berger wrote: > > > > > > Good question. I'm not sure why this code fails: > > > > > > #include > > > > > > 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. > > It should work for either singletons or instance methods. If it > didn't, then this code wouldn't work: > > class Foo > class << self > def bar > "hello" > end > alias baz bar > end > end > > p Foo.bar => "hello" > p Foo.baz => "hello" > > The C example I pasted is meant to do what I've done there. > > Internally rb_define_alias calls rb_alias (in eval.c) which checks to > see if klass is a singleton or not. So, in theory, I should be able to > do: > > rb_define_alias(singleton, baz, bar); > > But obviously I'm doing something wrong - I'm just not sure what. This is similar to what I was going to do - you just need to get the singleton class from the class. I _think_ in your example, cFoo == singleton. Something like this works: /* define singleton methods as normal */ VALUE singleton = rb_singleton_class(cXMLNode); rb_define_alias(singleton, "new_element", "new"); I guess that would work with rb_alias too, but I thought there had to be a wrapper for this somewhere that I'd missed. > PS - A rb_define_singleton_alias() would be a handy function. :) > Agreed. Assuming it's not already lurking somewhere, that is. :) Cheers, -- Ross Bamford - rosco@roscopeco.REMOVE.co.uk