Estendendo Ruby com C – uma amostra de

Não há complicações na extensão do Ruby. Claro, você deve pelo menos ter um conhecimento básico de C.

Vamos criar um exemplo simples:

Crie um diretório para nossa extensão Ruby:

mkdir <your_path>/coderwall

Crie um arquivo C denominado coderwall.c , dentro desse ruby.hcabeçalho de inclusão .
c include <ruby.h>

Tudo é um VALUEem Ruby, então para criar um módulo, vamos criar um mCoderwallque representa isso:

VALUE mCoderwall;

E um VALUEpara representar uma classe por trás deste módulo:

VALUE cTalker;

Nossa classe Talker deve fazer algo. Vamos criar uma função que retorna uma Ruby String.

static VALUE say_yeah(VALUE self){
const char *sentence= "YEAH YEAH!";
return rb_str_new2(sentence);
}

Na função representa nosso objeto. é string tp ser retornado E a função converte a em Rubysay_yeah VALUE selfself
sentence
rb_str_new2*charString

Para traduzir nossa extensão para Ruby World, criamos uma função com Init_coderwall que sempre deve começar 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);
}

A função rb_define_moduledefine um módulo na Hierarquia de nível superior. Igual a :

module Coderwall

end

A função rb_define_class_underdefine uma classe em um módulo ou outra classe. Ele criará:

module Coderwall
class Talker

end
end

A função rb_define_singleton_methodcria um método singleton em alguma classe ou módulo. Nesse caso, em Talkeraula.

Para rodar nosso código devemos criar um arquivo chamado e colocar o conteúdo abaixo.extconf.rb

require 'mkmf'
create_makefile
('coderwall')

Execute o script. Ele criará um Makefilepara construir a extensão.

$ ruby extconf.rb

Compilar e instalar a extensão

$ make && make install

Para ver o código funcionando, você pode exigir nossa nova extensão e executá-la:

$irb(main):001:0> require 'coderwall'
true

$irb
(main):002:0> Coderwall::Talker.say_yeah
"YEAH YEAH!"

SIM SIM !!