# Calling class methods from C

**URL:** <https://www.ruby-forum.com/t/calling-class-methods-from-c/158389>\
**Category:** Ruby\
**Created:** [January 22, 2009, 8:12pm UTC](https://www.ruby-forum.com/t/calling-class-methods-from-c/158389 "2009-01-22T20:12:55Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![rambor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9de053/32.png) [@rambor](https://www.ruby-forum.com/u/rambor)\
**Post date:** [January 22, 2009, 8:12pm UTC](https://www.ruby-forum.com/t/calling-class-methods-from-c/158389/1 "2009-01-22T20:12:55Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![rambor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9de053/32.png) [@rambor](https://www.ruby-forum.com/u/rambor)\
**Post date:** [January 22, 2009, 8:25pm UTC](https://www.ruby-forum.com/t/calling-class-methods-from-c/158389/2 "2009-01-22T20:25:54Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![rambor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9de053/32.png) [@rambor](https://www.ruby-forum.com/u/rambor)\
**Post date:** [January 22, 2009, 8:30pm UTC](https://www.ruby-forum.com/t/calling-class-methods-from-c/158389/3 "2009-01-22T20:30:36Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![rambor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9de053/32.png) [@rambor](https://www.ruby-forum.com/u/rambor)\
**Post date:** [January 22, 2009, 8:36pm UTC](https://www.ruby-forum.com/t/calling-class-methods-from-c/158389/4 "2009-01-22T20:36:08Z")

</div>

Jason R. 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)?
