Calling class methods from C

Discussion in 'Ruby' started by Robert Rouse, Jan 22, 2009.

  1. Robert Rouse

    Robert Rouse Guest

    Hello,

    I'm trying to call a class method from C. I've tried all combinations of
    rb_intern I could think of to make it work, but I've gotten nothing.

    Example class

    class CallTest
    def go
    (do something here)
    end

    end

    rb_funcall(?, rb_intern("go"), 0);

    What goes in the ? space? I know if I use Qnil there, it will call
    global functions, but I'd prefer class methods.

    Am I heading in the wrong direction?

    Also, I'd prefer not to have to know the class name ahead of time if
    possible, but if I have to require that I know what it is, I can try
    passing it by name to my application.

    I'm using SWIG to generate the binding.
    --
    Posted via http://www.ruby-forum.com/.
     
    Robert Rouse, Jan 22, 2009
    #1
    1. Advertising

  2. From the top of my head:

    rb_funcall(rb_const_get("CallTest"), rb_intern("go"), 0);

    And if you're calling "global" methods, it's better to call it on
    Kernel, where the methods are defined anyway:

    rb_funcall(rb_mKernel, rb_intern("method_name"), args);

    Hope that helps.

    Jason

    On Thu, Jan 22, 2009 at 2:11 PM, Robert Rouse <> wrote:
    > Hello,
    >
    > I'm trying to call a class method from C. I've tried all combinations of
    > rb_intern I could think of to make it work, but I've gotten nothing.
    >
    > Example class
    >
    > class CallTest
    > def go
    > (do something here)
    > end
    >
    > end
    >
    > rb_funcall(?, rb_intern("go"), 0);
    >
    > What goes in the ? space? I know if I use Qnil there, it will call
    > global functions, but I'd prefer class methods.
    >
    > Am I heading in the wrong direction?
    >
    > Also, I'd prefer not to have to know the class name ahead of time if
    > possible, but if I have to require that I know what it is, I can try
    > passing it by name to my application.
    >
    > I'm using SWIG to generate the binding.
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >
     
    Jason Roelofs, Jan 22, 2009
    #2
    1. Advertising

  3. Bah, saw a small issue right when I hit "Send".

    My call line works for a class defined as such:

    class CallTest
    def self.go
    (do something here)
    end
    end

    If you need to call an instance method on an instance of the class
    CallTest, you need to of course get a hold of that instance, or make a
    new one:

    VALUE obj = rb_funcall(rb_const_get("CallTest"), rb_intern("new"), 0);
    rb_funcall(obj, rb_intern("go"), 0);

    Jason

    On Thu, Jan 22, 2009 at 2:19 PM, Jason Roelofs <> wrote:
    > From the top of my head:
    >
    > rb_funcall(rb_const_get("CallTest"), rb_intern("go"), 0);
    >
    > And if you're calling "global" methods, it's better to call it on
    > Kernel, where the methods are defined anyway:
    >
    > rb_funcall(rb_mKernel, rb_intern("method_name"), args);
    >
    > Hope that helps.
    >
    > Jason
    >
    > On Thu, Jan 22, 2009 at 2:11 PM, Robert Rouse <> wrote:
    >> Hello,
    >>
    >> I'm trying to call a class method from C. I've tried all combinations of
    >> rb_intern I could think of to make it work, but I've gotten nothing.
    >>
    >> Example class
    >>
    >> class CallTest
    >> def go
    >> (do something here)
    >> end
    >>
    >> end
    >>
    >> rb_funcall(?, rb_intern("go"), 0);
    >>
    >> What goes in the ? space? I know if I use Qnil there, it will call
    >> global functions, but I'd prefer class methods.
    >>
    >> Am I heading in the wrong direction?
    >>
    >> Also, I'd prefer not to have to know the class name ahead of time if
    >> possible, but if I have to require that I know what it is, I can try
    >> passing it by name to my application.
    >>
    >> I'm using SWIG to generate the binding.
    >> --
    >> Posted via http://www.ruby-forum.com/.
    >>
    >>

    >
     
    Jason Roelofs, Jan 22, 2009
    #3
  4. Robert Rouse

    Robert Rouse Guest

    Jason Roelofs wrote:
    > Bah, saw a small issue right when I hit "Send".
    >
    > My call line works for a class defined as such:
    >
    > class CallTest
    > def self.go
    > (do something here)
    > end
    > end
    >
    > If you need to call an instance method on an instance of the class
    > CallTest, you need to of course get a hold of that instance, or make a
    > new one:
    >
    > VALUE obj = rb_funcall(rb_const_get("CallTest"), rb_intern("new"), 0);
    > rb_funcall(obj, rb_intern("go"), 0);
    >
    > Jason


    I tried using rb_const_get but it doesn't appear to call the method.
    What should I use for those parameters (VALUE and ID)?
    --
    Posted via http://www.ruby-forum.com/.
     
    Robert Rouse, Jan 22, 2009
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. E11
    Replies:
    1
    Views:
    4,902
    Thomas Weidenfeller
    Oct 12, 2005
  2. Oliver Wong
    Replies:
    14
    Views:
    1,671
    Chris Uppal
    Jun 13, 2006
  3. Oltmans
    Replies:
    6
    Views:
    371
    Terry Reedy
    Mar 11, 2009
  4. Rhino
    Replies:
    49
    Views:
    1,061
  5. Kenneth McDonald
    Replies:
    5
    Views:
    356
    Kenneth McDonald
    Sep 26, 2008
Loading...

Share This Page