From: Dave Thomas Date: 2000-03-16T16:05:08-06:00 Subject: [ruby-talk:01930] Re: object creation Clemens Hintze writes: > Andrew Hunt writes: > > >> Agreed, but here's my real question: suppose you have a > > >> non-built- in class such as MD5, which does not expose a > > >> C-level constructor (something like rb_str_new, > > >> rb_time_new, etc). What is the preferred way to create a > > >> new MD5 object from C code? > > > > > >Hmmmm! I would say that this is impossible, at a first > > >glance. This MD5 class has to implement a C function that > > >would be connected to MD5::new at Ruby level. So you would > > >have to search something like (example taken from > > >ext/gdbm/gdbm.c): > > > > > > rb_define_singleton_method(cGDBM, "new", fgdbm_s_open, -1); > > > > If a class defines it's own new (or open, or whatever) wouldn't it > > be easier just to call that method using the funcall mechanism? > > It would be easier, of course. But it would also be slower and would > invoke the interpreter again. I would code an own local function, that > call the fgdbm_s_open function directly. Then I would use this local > function in my extension. Now I'm probably missing something, but wouldn't calling the constructor indirectly also allow the users of the extension override the default initialization? To me, it seems like the interpreter goes to a lot of trouble to use rb_funcall to ensure that it correctly allows the user to override methods. Shouldn't the extensions do likewise? Regards Dave