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.h
cabeçalho de inclusão .c include <ruby.h>
Tudo é um VALUE
em Ruby, então para criar um módulo, vamos criar um mCoderwall
que representa isso:
VALUE mCoderwall;
E um VALUE
para 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 self
self
sentence
rb_str_new2
*char
String
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_module
define um módulo na Hierarquia de nÃvel superior. Igual a :
module Coderwall
end
A função rb_define_class_under
define uma classe em um módulo ou outra classe. Ele criará:
module Coderwall
class Talker
end
end
A função rb_define_singleton_method
cria um método singleton em alguma classe ou módulo. Nesse caso, em Talker
aula.
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 Makefile
para 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 !!