From: Andrew Hunt Date: 2000-03-16T14:27:12-05:00 Subject: [ruby-talk:01922] Re: object creation >> 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? Of course, the preferred route would be to define a C-level constructor (as the built-in classes have). But if that didn't exist, as is the case with MD5, wouldn't it be better to call the "new" method through a funcall rather than poking around directly in its implementation? >I admit, it looks a little bit complicate. That is the reason, >extensions should have a method like rb_str_new2 (that I would call an >C constructor) too, if they are intended to be used on C level. I agree completely; I think all extensions should define a C constructor - I shall make that recomendation in our book... /\ndy -- Andrew Hunt, The Pragmatic Programmers, LLC. Innovative Object-Oriented Software Development web: http://www.pragmaticprogrammer.com email: andy@pragmaticprogrammer.com -- Our New Book: "The Pragmatic Programmer" Published by Addison-Wesley Oct 1999 (see www.pragmaticprogrammer.com/ppbook) --