[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Calling class methods from C

Robert Rouse

1/22/2009 7:11:00 PM

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-....

3 Answers

Jason Roelofs

1/22/2009 7:24:00 PM

0

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 <scyllinice@scyllinice.com> 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-....
>
>

Jason Roelofs

1/22/2009 7:28:00 PM

0

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 <jameskilton@gmail.com> 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 <scyllinice@scyllinice.com> 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-....
>>
>>
>

Robert Rouse

1/22/2009 7:34:00 PM

0

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-....