Extending Ruby with C - a taste of
There is not complications extending Ruby. Of course, you at least should have a basic C knowledge.
Let's create a simple example :
Create a directory to our Ruby Extension:
mkdir <your_path>/coderwall
Create a C file named coderwall.c, inside that include ruby.h header.
c
include <ruby.h>
Everything is a VALUE in Ruby, so to create a module, let's create a mCoderwall representing that:
VALUE mCoderwall;
And a VALUE to represent a class behind this module:
VALUE cTalker;
Our Talker class should do something. Let's create a function that returns a Ruby String.
static VALUE say_yeah(VALUE self){
const char *sentence= "YEAH YEAH!";
return rb_str_new2(sentence);
}
In the function say_yeah VALUE self represents our self object.
sentence is string tp be returned
And the function rb_str_new2 converts a *char to a Ruby String
To translate our extension to Ruby World, we create a function Init_coderwall It must always starts with Init_.
void Init_coderwall(){
mCoderwall = rb_define_module("Coderwall");
cTalker = rb_define_class_under(mCoderwall, "Talker", rb_cObject);
rb_define_singleton_method(cTalker, "say_yeah", say_yeah, 0);
}
The function rb_define_module defines a module at the top level Hierarchy. Same as :
module Coderwall
end
The function rb_define_class_under defines a class under a module or another class. It will create:
module Coderwall
class Talker
end
end
The function rb_define_singleton_method creates a singleton method under some class or module. In this case, under Talker class.
To run our code we should create a file called extconf.rb and put it the content bellow inside.
require 'mkmf'
create_makefile('coderwall')
Execute the script. It will create a Makefile to build the extension.
$ ruby extconf.rb
Compile and Install the Extension
$ make && make install
To see the code working you can require our new extension and execute it :
$irb(main):001:0> require 'coderwall'
true
$irb(main):002:0> Coderwall::Talker.say_yeah
"YEAH YEAH!"
YEAH YEAH !!
Written by Tony Fabeen
Related protips
1 Response
Tip: pt-BR version at http://1up4dev.org/2013/07/extendendo-ruby-com-c-so-um-aperitivo