# Add a method as C extension to a class defined in Ruby

**URL:** <https://www.ruby-forum.com/t/add-a-method-as-c-extension-to-a-class-defined-in-ruby/164654>\
**Category:** Ruby\
**Created:** [April 3, 2009, 5:47pm UTC](https://www.ruby-forum.com/t/add-a-method-as-c-extension-to-a-class-defined-in-ruby/164654 "2009-04-03T17:47:12Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [April 3, 2009, 5:47pm UTC](https://www.ruby-forum.com/t/add-a-method-as-c-extension-to-a-class-defined-in-ruby/164654/1 "2009-04-03T17:47:12Z")

</div>

Hi, in case I want to add a method (using C) for a class I’ve created  
in pure Ruby, must I also create the class in C?

If not, how to fill MY\_CLASS here?:

rb\_define\_method(MY\_CLASS, “my\_method”, my\_method, arg\_count);

Thanks.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [April 3, 2009, 6:04pm UTC](https://www.ruby-forum.com/t/add-a-method-as-c-extension-to-a-class-defined-in-ruby/164654/2 "2009-04-03T18:04:49Z")

</div>

On Sat, 2009-04-04 at 00:45 +0900, IÃ±aki Baz C. wrote:

> Hi, in case I want to add a method (using C) for a class I’ve created  
> in pure Ruby, must I also create the class in C?

Something like this should work:

static VALUE  
rb\_foo(VALUE self)  
{  
rb\_p(INT2FIX(42));  
return Qnil;  
}

void  
Init\_foo(void)  
{  
VALUE klass = rb\_const\_get(rb\_cObject, rb\_intern(“Foo”));  
rb\_define\_method(klass, “foo”, rb\_foo, 0);  
}

Then you should be able to do

class Foo; end  
require ‘foo’  
Foo.new.foo

HTH,  
Andre

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [April 3, 2009, 6:29pm UTC](https://www.ruby-forum.com/t/add-a-method-as-c-extension-to-a-class-defined-in-ruby/164654/3 "2009-04-03T18:29:23Z")

</div>

2009/4/3 Andre N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Â Â return Qnil;
> 
> class Foo; end  
> require ‘foo’  
> Foo.new.foo

Thanks a lot!

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [April 3, 2009, 10:40pm UTC](https://www.ruby-forum.com/t/add-a-method-as-c-extension-to-a-class-defined-in-ruby/164654/4 "2009-04-03T22:40:42Z")

</div>

On Apr 3, 2009, at 09:03, Andre N. wrote:

> return Qnil;  
> }
> 
> void  
> Init\_foo(void)  
> {  
> VALUE klass = rb\_const\_get(rb\_cObject, rb\_intern(“Foo”));  
> rb\_define\_method(klass, “foo”, rb\_foo, 0);  
> }

It’s better with RubyInline:

require ‘rubygems’  
require ‘inline’

class Foo  
inline :C do |builder|  
builder.c \<\<-C  
void foo() {  
rb\_p(INT2FIX(42));  
}  
C  
end  
end

Foo.new.foo
